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

Ios 在Swift中将对象数组强制转换为子类对象数组,ios,swift,swift2,Ios,Swift,Swift2,我有一系列提示,如下所示: var currentReminders: [EKReminder]? = .... 我想把这个数组转换成一个数组的子类。假设这是子类: import Foundation import EventKit class NNReminder: EKReminder { var additionalNotes: String? } 我如何将currentReminders强制转换为[NNReminders]?我尝试了几种方法,但都失败了。如果您确定当前提醒的

我有一系列提示,如下所示:

var currentReminders: [EKReminder]? = ....
我想把这个数组转换成一个数组的子类。假设这是子类:

import Foundation
import EventKit

class NNReminder: EKReminder {
    var additionalNotes: String?
}
我如何将currentReminders强制转换为[NNReminders]?我尝试了几种方法,但都失败了。

如果您确定
当前提醒
的所有成员实际上都是
nnrementer
的成员,您可以按如下方式将它们全部强制转换:

currentReminders = currentReminders.map { $0 as! NNReminder }
编辑:如果只有部分提醒类型为
nnrementer
,或者您不确定数组的内容,则可以使用
flatMap
删除nil值:

currentReminders = currentReminders.flatMap { $0 as? NNReminder }
如果您询问如何转换初始化为
ekrementer
的一组对象,您应该在
nnrementer
中编写一个自定义
init
,它接受
ekrementer
,并在上面的映射方法中使用此
init

如果您确定
currentReminders
的所有成员实际上都是
nnReminders
s,则可以按如下方式强制转换它们:

currentReminders = currentReminders.map { $0 as! NNReminder }
编辑:如果只有部分提醒类型为
nnrementer
,或者您不确定数组的内容,则可以使用
flatMap
删除nil值:

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

如果您询问如何转换初始化为
ekrementer
的一组对象,您应该在
nnrementer
中编写一个自定义
init
,它接受
ekrementer
,在上面的map方法中使用这个
init

我厌倦了在我的代码中到处都是神秘的.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!
扩展数组{
函数类型转换(类型:T.type?=nil)->[T]{
返回self.map{$0 as!T}
}
}
示例:

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!
A类:B类{
var值:String=“默认值”
init(u值:字符串){
自我价值=价值
}
}
B类{
var someNum:CGFloat=1
init(){
}
}
var arr1:Array=[A(“A”)、A(“b”)、A(“c”)]
让arr2:Array=arr1.cast(B.self)//整洁!
让arr3:Array=arr1.cast()//史诗!
注意:

cast方法也支持协议

我已经厌倦了在我的代码中到处都是神秘的.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!
扩展数组{
函数类型转换(类型:T.type?=nil)->[T]{
返回self.map{$0 as!T}
}
}
示例:

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!
A类:B类{
var值:String=“默认值”
init(u值:字符串){
自我价值=价值
}
}
B类{
var someNum:CGFloat=1
init(){
}
}
var arr1:Array=[A(“A”)、A(“b”)、A(“c”)]
让arr2:Array=arr1.cast(B.self)//整洁!
让arr3:Array=arr1.cast()//史诗!
注意:

强制转换方法也支持协议

当您尝试时,您收到的错误消息是什么?当您尝试时,您收到的错误消息是什么?请注意,应避免强制转换,因为强制转换往往会生成错误消息crashe@Cristik是的,这就是为什么我提到他应该确定演员阵容可以完成的原因(也就是说,他自己在前面用
nnrementer
s初始化了数组)。不过是在一个更安全的操作中编辑的。谢谢康纳!这帮了忙。:)这是用于向下投射数组的。如果你想向上投射,那么你可以使用as![ClassTypeHere]请注意,应避免强制强制转换,因为强制转换往往会生成crashe@Cristik是的,这就是为什么我提到他应该确保可以进行强制转换(即,他在前面用
nnrementer
s初始化了数组)。不过是在更安全的操作中编辑的。谢谢康纳!这很有帮助。:)这是用于向下投射阵列的。如果你想向上投射,那么你可以使用as![ClassTypeHere]您还可以将cast函数的参数设置为可选,默认值为
nil
,它将推断出正确的类型,这样您就不必通过
B。self
会让它变得更好!接得好“丹”。在操场上工作完美无瑕,甚至用一个协议测试它只是为了确定。我更新了代码示例以反映您的建议。您还可以将cast函数的参数设置为可选,默认值为
nil
,它将推断出正确的类型,这样您就不必通过
B。self
会使它更棒!接得好“丹”。在操场上工作完美无瑕,甚至用一个协议测试它只是为了确定。我更新了代码示例以反映您的建议。