Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 泛型类使用从函数返回的某个类会导致错误_Swift_Generics - Fatal编程技术网

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
}