如何在 Swift 中声明协议约束泛型变量?
How to declare protocol constrainted generic variable in Swift?
我需要创建一个字典变量,我的值将为 SomeOtherClass
class 并符合 SomeProtocol
。这等于 Objective-C 中的以下声明:
NSMutableDictionary<SomeClass *, SomeOtherClass<SomeProtocol> *> *someOtherBySome;
那么,是否可以使用 Swift 以同样简单的方式做到这一点?
我需要它,因为我可以用签名创建 func
:
func someFunc<T: SomeOtherClass where T: SomeProtocol>(param: T, otherParam: String)
并且我想从 Dictionary
中获取 param
参数的值而不进行类型转换。
简答
在 Swift 中,您不能声明给定 class
和 的变量符合 protocol
.
可能的解决方案 (?)
但是根据您已有的定义
class SomeClass: Hashable {
var hashValue: Int { return 0 } // your logic goes here
}
func ==(left:SomeClass, right:SomeClass) -> Bool {
return true // your logic goes here
}
class SomeOtherClass {}
protocol SomeProtocol {}
也许你可以简单地让 SomeOtherClass
符合 SomeProtocol
来解决你的问题
extension SomeOtherClass: SomeProtocol { }
现在您可以简单地
var dict : [SomeClass: SomeOtherClass] = [SomeClass(): SomeOtherClass()]
let someProtocolValue: SomeProtocol = dict.values.first!
对你有帮助吗?
我需要创建一个字典变量,我的值将为 SomeOtherClass
class 并符合 SomeProtocol
。这等于 Objective-C 中的以下声明:
NSMutableDictionary<SomeClass *, SomeOtherClass<SomeProtocol> *> *someOtherBySome;
那么,是否可以使用 Swift 以同样简单的方式做到这一点?
我需要它,因为我可以用签名创建 func
:
func someFunc<T: SomeOtherClass where T: SomeProtocol>(param: T, otherParam: String)
并且我想从 Dictionary
中获取 param
参数的值而不进行类型转换。
简答
在 Swift 中,您不能声明给定 class
和 的变量符合 protocol
.
可能的解决方案 (?)
但是根据您已有的定义
class SomeClass: Hashable {
var hashValue: Int { return 0 } // your logic goes here
}
func ==(left:SomeClass, right:SomeClass) -> Bool {
return true // your logic goes here
}
class SomeOtherClass {}
protocol SomeProtocol {}
也许你可以简单地让 SomeOtherClass
符合 SomeProtocol
extension SomeOtherClass: SomeProtocol { }
现在您可以简单地
var dict : [SomeClass: SomeOtherClass] = [SomeClass(): SomeOtherClass()]
let someProtocolValue: SomeProtocol = dict.values.first!
对你有帮助吗?