基本方式不起作用.
for index in 0 ..< list.count {
if list[index] == nil {
list.removeAtIndex(index) //this will cause array index out of range
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Array的扩展,它允许将一个可选的T数组转换成一个非可选的T数组.
例如,这可以写成这样的自由函数:
func removeAllNils(array: [T?]) -> [T] {
return array
.filter({ $0 != nil }) // remove nils, still a [T?]
.map({ $0! }) // convert each element from a T? to a T
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法将其作为扩展工作.我试图告诉编译器扩展只适用于可选值的数组.这是我到目前为止:
extension Array {
func filterNils<U, T: Optional<U>>() -> [U] {
return filter({ $0 != nil }).map({ $0! })
}
}
Run Code Online (Sandbox Code Playgroud)
(它不编译!)
protocol P : class {
var value:Int {get}
}
class X : P {
var value = 0
init(_ value:Int) {
self.value = value
}
}
var ps:[P] = [X(1), X(2)]
for p in ps {
if let x = p as? X { // works for a single variable
...
}
}
if let xs = ps as? [X] { // doesn't work for an array (EXC_BAD_ACCESS)
...
}
Run Code Online (Sandbox Code Playgroud)
如果P是类而不是协议,则代码正常工作.类和协议之间有什么区别?它们都是作为堆中的指针实现的,不是吗?上面的代码可以成功编译,但在运行时崩溃.这个EXC_BAD_ACCESS错误是什么意思?
感谢@Antonio,但我仍然不明白这个示例代码是如何工作的.
let someObjects: [AnyObject] = [
Movie(name: "2001: A …Run Code Online (Sandbox Code Playgroud)