Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 2.0:创建符合通用协议的对象集合类型_Swift_Swift2_Swift Protocols - Fatal编程技术网

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")