Swift通用协议函数参数

时间:2016-11-05 19:45:09

标签: swift generics swift-protocols

这似乎应该对我有用。我所要做的就是使Rule协议能够performRule在任何采用该规则协议的结构上,然后返回一个布尔值。但是,根据我的代码目前的方式,我无法访问performRule(:value) 参数的任何属性。我觉得我错过了一个重要的概念,或者有些东西是错误的。您应该能够将下面的代码复制到游乐场,以便自己查看问题。

import Foundation

protocol NumberCalculation {
    var number : NSNumber { get set }
}

protocol Rule {
    var invalidMessage : String { get set }
    func performRule<T>(value: T) -> Bool
}

struct GreaterThanRule : Rule, NumberCalculation  {
    var invalidMessage: String
    var number : NSNumber

    init(valueMustBeGreaterThan value: NSNumber, withInvalidMessage message : String = "") {
        number = value
        invalidMessage = message
    }

    func performRule<NSNumber>(value: NSNumber) -> Bool {
        number.decimalValue // works 
        value.decimalValue // doesn't work
        return true
    }
}

1 个答案:

答案 0 :(得分:0)

<NSNumber>在您的performRule(value:)方法中定义了一个新的通用占位符类型,正如您将其命名为NSNumber一样,它将影响基金会的{{1} }} - 表示NSNumber参数的类型为您的通用占位符,而非基金会的value:

如果您希望它符合NSNumber的类型可以为Rule方法的参数选择自己的类型 - 那么您需要associated type,而不是通用占位符。< / p>

performRule(value:)