我有一个EKReminder数组,如下所示:
var currentReminders: [EKReminder]? = ....
我想将此数组转换为EKReminder的子类数组。让我们说这是子类:
import Foundation
import EventKit
class NNReminder: EKReminder {
var additionalNotes: String?
}
我如何将currentReminders转换为[NNReminder]?我尝试了几种方法,但都失败了。
答案 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方法也支持协议