Hat*_*r J 9 arrays generics ios swift
考虑一个协议和一个实现它的类:
protocol MyProtocol {
var x: Int { get }
}
class MyClass : MyProtocol {
var x: Int = 5
}
Run Code Online (Sandbox Code Playgroud)
我有一个类型的数组,[MyClass]我希望将它分配给一个类型的变量[MyProtocol].但是,这在Playground(XCode 6.3,Swift 1.2)中尝试时会导致错误:
var classArr: [MyClass] = [MyClass(), MyClass()]
var protocolArrA: [MyProtocol] = classArr // Causes error: EXC_BAD_INSTRUCTION
var protocolArrB: [MyProtocol] = classArr as [MyProtocol] // Causes error: EXC_BAD_INSTRUCTION
var protocolArrC: [MyProtocol] = [MyProtocol](classArr) // Causes error: Cannot find an initializer for type [MyProtocol[ that accepts an argument list of type [MyClass]
Run Code Online (Sandbox Code Playgroud)
在Swift中进行此分配的正确方法是什么?
PS有趣的是,当使用基类而不是协议时,表达式protocolArrA和protocolArrB工作没有错误.
值得注意的是,分配新创建的[MyClass]实例也很有效:
var protocolArrD: [MyProtocol] = [MyClass]() // A-OK!
Run Code Online (Sandbox Code Playgroud)
vac*_*ama 11
您可以使用map将每个元素强制转换为所需的类型:
protocol MyProtocol {
var x: Int { get }
}
class MyClass : MyProtocol {
var x: Int = 5
}
var classArr: [MyClass] = [MyClass(), MyClass()]
var protocolArrA:[MyProtocol] = classArr.map{$0 as MyProtocol}
var andBack:[MyClass] = protocolArrA.map{$0 as! MyClass}
Run Code Online (Sandbox Code Playgroud)
注意,Swift能够推断出上面的所有数组类型,所以这可以更简洁地写成:
var classArr = [MyClass(), MyClass()]
var protocolArrA = classArr.map{$0 as MyProtocol}
var andBack = protocolArrA.map{$0 as! MyClass}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1634 次 |
| 最近记录: |