gpt4 book ai didi

swift 2.0 : Creating a Collection Type of Objects that conform to a Generic Protocol

转载 作者:可可西里 更新时间:2023-11-01 00:37:20 26 4
gpt4 key购买 nike

例如:

protocol SomeProtocol {
typealias T
func doSomething(something: T)
}
let a = Array<SomeProtocol>()

我想要一个数组,它是一个符合SomeProtocol 的对象数组。这在理论上似乎很好,但我收到以下错误消息:

Cannot be used as a generic constraint because it contains assosciated type requirements.

我想这是有道理的,毕竟 Array 也是一个通用结构,因此编译器将无法确定 SomeProtocol 的实际类型数组 是通用的。

所以我的问题是 - 我觉得我应该能够拥有一个符合 SomeProtocol 的对象数组 - 目前在 Swift 2.0 中这可能吗?我是不是以完全错误的方式思考这个问题?

最佳答案

此错误消息的原因是如果您的 Array 出现以下问题声明将起作用:

protocol SomeProtocol {
typealias T
func doSomething(something: T)
}
// has already some values
let a: Array<SomeProtocol> = [...]

// what type should be passed as parameter?
// the type of T in SomeProtocol is not defined
a[0].doSomething(...)

作为解决方法,您可以为任何类型的 SomeProtocol 创建一个通用的包装器结构。所以你可以指定 T 的类型(就像在 Swift 标准库 AnyGenerator、AnySequence 中,...)。

struct AnySomeProtocol<T>: SomeProtocol {
let _doSomething: T -> ()
// can only be initialized with a value of type SomeProtocol
init<Base: SomeProtocol where Base.T == T>(_ base: Base) {
_doSomething = base.doSomething
}
func doSomething(something: T) {
_doSomething(something)
}
}

现在您使用类型为 [AnySomeProtocol<T>] 的数组(将 T 替换为您想要的任何类型)并在附加元素之前将其转换为 AnySomeProtocol :

var array = [AnySomeProtocol<String>]()
array.append(AnySomeProtocol(someType))

// doSomething can only be called with a string
array[0].doSomething("a string")

关于 swift 2.0 : Creating a Collection Type of Objects that conform to a Generic Protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513769/

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