如何在Swift中声明协议约束的泛型变量?

时间:2016-07-25 18:19:15

标签: swift generics nsmutabledictionary swift-dictionary

我需要创建一个字典变量,其中我的值为SomeOtherClass类,并且符合SomeProtocol。这等于Objective-C中的以下声明:

NSMutableDictionary<SomeClass *, SomeOtherClass<SomeProtocol> *> *someOtherBySome;

那么,是否可以使用Swift以相同的简单方式完成它?

我需要它,因为我可以使用签名创建func

func someFunc<T: SomeOtherClass where T: SomeProtocol>(param: T, otherParam: String)

我希望从param获取Dictionary参数的值而不进行类型转换。

1 个答案:

答案 0 :(得分:2)

简短回答

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

对你有帮助吗?