这似乎应该对我有用。我所要做的就是使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
}
}
答案 0 :(得分:0)
说<NSNumber>
在您的performRule(value:)
方法中定义了一个新的通用占位符类型,正如您将其命名为NSNumber
一样,它将影响基金会的{{1} }} - 表示NSNumber
参数的类型为您的通用占位符,而非基金会的value:
。
如果您希望它符合NSNumber
的类型可以为Rule
方法的参数选择自己的类型 - 那么您需要associated type,而不是通用占位符。< / p>
performRule(value:)