【发布时间】:2018-03-02 23:54:28
【问题描述】:
我想要完成的是将对象的动态类型作为参数传递给泛型函数。我可以通过type(of:) 看到我想要的正确类型,但我无法将它作为参数传递,因为在泛型函数中我仍然得到静态类型。
这是我想做的一个例子:
protocol SomeUsefulProtocol {}
struct MyType1: SomeUsefulProtocol {}
struct MyType2: SomeUsefulProtocol {}
let objects: [SomeUsefulProtocol] = [MyType1(), MyType2()]
let someClosureToWorkWithMyType: Any = { (object: MyType1) in
//Do some great things
}
func someMethod<T>(type: T.Type, object: Any) {
typealias ClosureType = (T) -> Void
if let closure = someClosureToWorkWithMyType as? ClosureType, let object = object as? T {
closure(object)
}
}
for object in objects {
someMethod(type: type(of: object), object: object)
}
这里我希望在对象的类型为“MyType1”时调用闭包 someClosureToWorkWithMyType,但在方法内部,对象的类型是静态类型 (SomeUsefulProtocol)。
【问题讨论】:
-
您的代码似乎比它需要的要复杂一些。你为什么将关闭声明为
Any?其次,您可以简单地迭代数组并为MyType1的对象执行闭包,无需中间函数。
标签: swift generics reflection swift-protocols