相关疑难解决方法(0)

如何删除Swift数组中的所有nil元素?

基本方式不起作用.

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)

ios swift

47
推荐指数
3
解决办法
3万
查看次数

创建一个扩展来从Swift中的Array过滤nils

我正在尝试编写一个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)

(它不编译!)

arrays generics swift swift-extensions

46
推荐指数
6
解决办法
2万
查看次数

协议类型数组不能向下转换为具体类型数组

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)

arrays protocols downcast swift

15
推荐指数
1
解决办法
2487
查看次数

标签 统计

swift ×3

arrays ×2

downcast ×1

generics ×1

ios ×1

protocols ×1

swift-extensions ×1