在Swift中将对象数组转换为子类对象数组

时间:2016-07-12 18:03:05

标签: ios swift swift2

我有一个EKReminder数组,如下所示:

var currentReminders: [EKReminder]? = ....

我想将此数组转换为EKReminder的子类数组。让我们说这是子类:

import Foundation
import EventKit

class NNReminder: EKReminder {
    var additionalNotes: String?
}

我如何将currentReminders转换为[NNReminder]?我尝试了几种方法,但都失败了。

2 个答案:

答案 0 :(得分:2)

如果您确定 currentReminders的所有成员实际上都是NNReminder,那么您可以将它们全部投射出来:

currentReminders = currentReminders.map { $0 as! NNReminder }

编辑:如果只有部分提醒类型为NNReminder,或者您不确定数组的内容,则可以使用flatMap删除nil值:

currentReminders = currentReminders.flatMap { $0 as? NNReminder }

如果您询问如何转换初始化为EKReminder的一堆对象,则应在init中编写一个自定义NNReminder,其中需要EKReminder,在上面的地图方法中使用此init

答案 1 :(得分:0)

我厌倦了在我的代码中使用神秘的.map子句,所以我写了一个小扩展来使事情变得整洁:

extension Array{
    func cast<T>(type:T.Type? = nil) -> [T]{
        return self.map { $0 as! T }
    }
}

示例:

class A:B{
    var value:String = "default"
    init(_ value:String){
        self.value = value
    }
}
class B{
    var someNum:CGFloat = 1
    init(){

    }
}
var arr1:Array<A> = [A("a"),A("b"),A("c")]
let arr2:Array<B> = arr1.cast(B.self)//neat!
let arr3:Array<B> = arr1.cast()//epic!

注意:
cast方法也支持协议