如何在 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!

对你有帮助吗?