Swift 泛型类使用从函数返回的某个类会导致错误
我对使用泛型感到困惑 我想实现如下内容:Swift 泛型类使用从函数返回的某个类会导致错误,swift,generics,Swift,Generics,我对使用泛型感到困惑 我想实现如下内容: protocol SomeBasicProtocol {} class WantedClass<T>: NSObject where T: SomeBasicProtocol { let generic: T init(generic: T) { self.generic = generic super.init() } } class SomeClass1: SomeBasi
protocol SomeBasicProtocol {}
class WantedClass<T>: NSObject where T: SomeBasicProtocol {
let generic: T
init(generic: T) {
self.generic = generic
super.init()
}
}
class SomeClass1: SomeBasicProtocol {}
class SomeClass2: SomeBasicProtocol {}
class SomeClass3: SomeBasicProtocol {}
enum Provider: Int {
case one = 1
case two
case three
var providerClass: SomeBasicProtocol {
switch self {
case .one:
return SomeClass1()
case .two:
return SomeClass2()
case .three:
return SomeClass3()
}
}
}
let provider: Provider = .one
let classToInject = provider.providerClass
switch classToInject {
case let class1 as SomeClass1:
let wantedClass = WantedClass(generic: class1)
case let class2 as SomeClass2:
let wantedClass = WantedClass(generic: class2)
case let class3 as SomeClass3:
let wantedClass = WantedClass(generic: class3)
default:
return
}
让我们假设WantedClass为
class WantedClass<T>: NSObject where T: SomeBasicProtocol {
....
}
当我试图定义一个实例时
let provider: Provider = .one
let GenericClassIWantToInject = provider.providerClass
let wantedInstance = WantedClass<GenericClassIWantToInject>()
为了让事情更清楚,您已经做了所有正确的事情,除了最后一部分,您做了这个
let wantedInstance=WantedClass()
。让我们详细分析一下,看看您试图用这行代码做什么。您试图在编译时告诉编译器WantedClass有一个泛型参数,该参数必须是在运行时计算的GenericClassiWantInject
。你不觉得这不对吗?编译器能否在编译时通过在运行时计算的内容推断泛型参数的类型?因此,要回答您的一个问题,不,您不能以这种方式使用代码
您可以这样做:
protocol SomeBasicProtocol {}
class WantedClass<T>: NSObject where T: SomeBasicProtocol {
let generic: T
init(generic: T) {
self.generic = generic
super.init()
}
}
class SomeClass1: SomeBasicProtocol {}
class SomeClass2: SomeBasicProtocol {}
class SomeClass3: SomeBasicProtocol {}
enum Provider: Int {
case one = 1
case two
case three
var providerClass: SomeBasicProtocol {
switch self {
case .one:
return SomeClass1()
case .two:
return SomeClass2()
case .three:
return SomeClass3()
}
}
}
let provider: Provider = .one
let classToInject = provider.providerClass
switch classToInject {
case let class1 as SomeClass1:
let wantedClass = WantedClass(generic: class1)
case let class2 as SomeClass2:
let wantedClass = WantedClass(generic: class2)
case let class3 as SomeClass3:
let wantedClass = WantedClass(generic: class3)
default:
return
}
感谢@Serj
我已将代码更改为以下代码:
let providerClass = provider.providerClass
switch providerClass {
case is SomeClass1.Type:
let wantedInstance = WantedClass<SomeClass1>()
case is SomeClass2.Type:
let wantedInstance = WantedClass<SomeClass2>()
case is SomeClass3.Type:
let wantedInstance = WantedClass<SomeClass3>()
default: break
}
让providerClass=provider.providerClass
交换机提供程序类{
案例是一个类别。类型:
让wantedInstance=WantedClass()
案例是SomeClass2。类型:
让wantedInstance=WantedClass()
案例为SomeClass3。类型:
让wantedInstance=WantedClass()
默认值:中断
}
现在它工作了。更新了
WantedClass
的SomeClass1
、SomeClass2
和SomeClass3
子类。不
class WantedClass<T>: NSObject where T: SomeBasicProtocol {
override init() {
super.init()
}
}
switch classToInject {
case let class1 as SomeClass1:
let wantedClass = WantedClass<SomeClass1>()
case let class2 as SomeClass2:
let wantedClass = WantedClass<SomeClass2>()
case let class3 as SomeClass3:
let wantedClass = WantedClass<SomeClass3>()
default:
return
}
let providerClass = provider.providerClass
switch providerClass {
case is SomeClass1.Type:
let wantedInstance = WantedClass<SomeClass1>()
case is SomeClass2.Type:
let wantedInstance = WantedClass<SomeClass2>()
case is SomeClass3.Type:
let wantedInstance = WantedClass<SomeClass3>()
default: break
}