在 'Collection' 上引用实例方法 'stringify()' 需要类型 'Int' 和 'Stringify' 是等效的
Referencing instance method 'stringify()' on 'Collection' requires the types 'Int' and 'Stringify' be equivalent
我制作了一个 Stringify 协议,用于将实现该协议的类型转换为字符串。
protocol Stringify {
func stringify() -> String
}
extension Collection where Iterator.Element == Stringify {
/// changes all the elements in the collection to a String
func stringify() -> [String] {
var strings = [String]()
if let elements = self as? [Stringify] {
for element in elements {
strings.append(element.stringify())
}
}
return strings
}
}
extension Int: Stringify {
func stringify() -> String {
return String(self)
}
}
extension Double: Stringify {
func stringify() -> String {
return String(self)
}
}
let test = [5,6,7]
/// does work
[6,5,34].stringify()
/// does not work -> Error alert
test.stringify()
但是当我将 Ints 集合设置为 属性 并在其上使用 then stringify() 时,它不起作用。
错误:
Referencing instance method 'stringify()' on 'Collection' requires the
types 'Int' and 'Stringify' be equivalent
如果我直接使用它,一切都很好。
这里有什么问题?
extension Collection where Iterator.Element == Stringify
具有“相同类型要求”,并为元素类型为 Stringify
的集合定义扩展。但是 test
是 Int
的数组,即元素 符合 到 Stringify
协议。所以你想要的是
extension Collection where Iterator.Element : Stringify
或者,等价地,
extension Collection where Element : Stringify
的原因
/// does work
[6,5,34].stringify()
用你原来的定义编译是编译器从上下文中推断数组的类型为 [Stringify]
。
let test: [Stringify] = [5,6,7]
test.stringify()
也可以编译。
注意扩展方法中不需要强制转换self
。您可以将实现简化为
func stringify() -> [String] {
var strings = [String]()
for element in self {
strings.append(element.stringify())
}
return strings
}
或者只是
func stringify() -> [String] {
return self.map { [=16=].stringify() }
}
我制作了一个 Stringify 协议,用于将实现该协议的类型转换为字符串。
protocol Stringify {
func stringify() -> String
}
extension Collection where Iterator.Element == Stringify {
/// changes all the elements in the collection to a String
func stringify() -> [String] {
var strings = [String]()
if let elements = self as? [Stringify] {
for element in elements {
strings.append(element.stringify())
}
}
return strings
}
}
extension Int: Stringify {
func stringify() -> String {
return String(self)
}
}
extension Double: Stringify {
func stringify() -> String {
return String(self)
}
}
let test = [5,6,7]
/// does work
[6,5,34].stringify()
/// does not work -> Error alert
test.stringify()
但是当我将 Ints 集合设置为 属性 并在其上使用 then stringify() 时,它不起作用。
错误:
Referencing instance method 'stringify()' on 'Collection' requires the types 'Int' and 'Stringify' be equivalent
如果我直接使用它,一切都很好。
这里有什么问题?
extension Collection where Iterator.Element == Stringify
具有“相同类型要求”,并为元素类型为 Stringify
的集合定义扩展。但是 test
是 Int
的数组,即元素 符合 到 Stringify
协议。所以你想要的是
extension Collection where Iterator.Element : Stringify
或者,等价地,
extension Collection where Element : Stringify
的原因
/// does work
[6,5,34].stringify()
用你原来的定义编译是编译器从上下文中推断数组的类型为 [Stringify]
。
let test: [Stringify] = [5,6,7]
test.stringify()
也可以编译。
注意扩展方法中不需要强制转换self
。您可以将实现简化为
func stringify() -> [String] {
var strings = [String]()
for element in self {
strings.append(element.stringify())
}
return strings
}
或者只是
func stringify() -> [String] {
return self.map { [=16=].stringify() }
}