如何将通用T转换为符合协议

时间:2015-11-19 18:45:07

标签: swift generics

我需要在类中转换泛型类型以符合协议。我不能使用约束,因为容器类必须被序列化。那么,当我已经知道(我可以查看你看到的)它符合协议时,我怎么能把T转换成ZNumeric呢?

https://gzfiles.s3.amazonaws.com/1447528989_ñóñóñóñóñóñóñó ñó ñó.zip

2 个答案:

答案 0 :(得分:2)

因为必须在编译时知道泛型,所以你不能只在运行时检查一致性(我很确定)。我认为这更像你想要的东西:

class Container {
    required init?<T>(type: T.Type) {
        let a = GenericClass<T>()
        print(a)
    }

    required init?<T : ZNumeric>(type: T.Type) {
        let a = GenericClass<T>()
        print(a)

        print("is numeric")
        let b = RestrictedGenericClass<T>()
        print(b)
    }
}

将在编译时选择更具体的初始化程序。

答案 1 :(得分:0)

我认为你在寻找这个。

protocol ZNumeric {

}

extension Double: ZNumeric {

}

class GenericClass<T> {

}

class RestrictedGenericClass<T:ZNumeric> {

}

class Container<T> {
    required init?(value: T) {
    }
    convenience init?(_ value: T) {
        self.init(value: value)
        let a = GenericClass<T>()
        print(a)
    }
}
extension Container where T: ZNumeric {
    convenience init?(_ value: T) {
        self.init(value: value)
        let b = RestrictedGenericClass<T>() // Will not work obviously
        print(b)
    }
}

print("test Double")
let cDouble = Container(1.1) // if T.self is ZNumeric.Type is true
print("test String")
let cString = Container("") // if T.self is ZNumeric.Type is false

// test Double
// RestrictedGenericClass<Swift.Double>
// test String
// GenericClass<Swift.String>
  1. 制作内部必需的初始化程序
  2. 为T:AnyObject
  3. 制作初始化程序
  4. 为T:ZNumeric制作初始化程序