Swift 2.0:创建符合通用协议的对象集合类型
例如:Swift 2.0:创建符合通用协议的对象集合类型,swift,swift2,swift-protocols,Swift,Swift2,Swift Protocols,例如: protocol SomeProtocol { typealias T func doSomething(something: T) } let a = Array<SomeProtocol>() protocol-SomeProtocol{ 别名T func doSomething(某物:T) } 设a=Array() 我想要一个数组,它是一个符合SomeProtocol的对象数组。这在理论上似乎很好,但我得到以下错误消息: 无法用作泛型约束,因为它包含
protocol SomeProtocol {
typealias T
func doSomething(something: T)
}
let a = Array<SomeProtocol>()
protocol-SomeProtocol{
别名T
func doSomething(某物:T)
}
设a=Array()
我想要一个数组,它是一个符合SomeProtocol
的对象数组。这在理论上似乎很好,但我得到以下错误消息:
无法用作泛型约束,因为它包含关联的
类型要求
我想这是有道理的,毕竟数组也是一个泛型结构,因此编译器无法计算出SomeProtocol
和Array
都是泛型的,实际给出的类型是什么
所以我的问题是-我觉得我应该能够拥有一个符合
SomeProtocol
的对象数组-这在目前的Swift 2.0中是否可行?我是不是想错了?不,这不可能像现在在Swift 2中那样。在指定泛型类型的泛型参数之前,不能使用泛型类型。对于泛型类、结构和枚举,可以在使用它们的同时指定它们的泛型参数。例如,可以像这样使用数组:
let anArray: [String]
这里,当数组
用作变量类型时,将数组
的通用参数指定为字符串
但是,只有当具体类型符合泛型协议(具有关联类型的协议,名为typealias)时,才能指定其关联类型。当您使用泛型协议作为变量类型(如泛型类、结构或枚举)时,无法提供关联的类型。此错误消息的原因是,如果
数组
声明有效,则会出现以下问题:
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(...)
现在您使用类型为[AnySomeProtocol]
(将T
替换为所需的任何类型)的数组,并在附加元素之前将其转换为AnySomeProtocol
:
var array = [AnySomeProtocol<String>]()
array.append(AnySomeProtocol(someType))
// doSomething can only be called with a string
array[0].doSomething("a string")
var数组=[AnySomeProtocol]()
array.append(AnySomeProtocol(someType))
//doSomething只能用字符串调用
数组[0]。doSomething(“字符串”)
var array = [AnySomeProtocol<String>]()
array.append(AnySomeProtocol(someType))
// doSomething can only be called with a string
array[0].doSomething("a string")