gpt4 book ai didi

swift - 在 'stringify()' 上引用实例方法 'Collection' 需要类型 'Int' 和 'Stringify' 是等效的

转载 作者:可可西里 更新时间:2023-11-01 01:07:03 27 4
gpt4 key购买 nike

我制作了一个 Stringify 协议(protocol),将实现该协议(protocol)的类型转换为字符串。

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 协议(protocol)。所以你想要的是

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 { $0.stringify() }
}

关于swift - 在 'stringify()' 上引用实例方法 'Collection' 需要类型 'Int' 和 'Stringify' 是等效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56988636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com