Swift对象数组符合协议

时间:2016-08-15 00:05:43

标签: swift

我有这样的协议:

protocol Datable {
    var date: NSDate { get set }
}

struct DEPref: Datable {
   var date: NSDate
}

struct DEPObs: Datable {
   var date: NSDate
}

func fetchDepRefs() -> [DEPRef] {...}
func fetchDepObss() -> [DEPObs] {...}

我想创建一个DEPrefDEPObs数组,以便对最终列表进行排序。

我尝试了很多东西,但编译器抱怨。例如:

var depRefList: Array<Datable> = fetchDepRefs()
var depObsList: Array<Datable> = fetchDepObss()
var allDeps = ...

第一行出错 &#34;无法将[DEPref]类型的值转换为指定类型数组&#34;

3 个答案:

答案 0 :(得分:3)

我对Swift / iOS编程很新,但是这样的东西适合我。

func fetchDepRefs() -> Array<Datable> {return Array<Datable>()}

var depRefList = fetchDepRefs()
var testDEPref = DEPref(date: NSDate())
var testDEPref2 = DEPref(date: NSDate())

depRefList.append(testDEPref)
depRefList.append(testDEPref2)

for ref in depRefList {
    print(ref.date)
}

您的功能也可以返回[Datable]

例如

func fetchDepRefs() -> [Datable] {return [Datable]()}

这也适用于您的场景

编辑:

或者,如果您在功能中寻找类型安全,以下代码也可以使用

func fetchDepRefs() -> [DEPref] {return [DEPref]()}
func fetchDepObss() -> [DEPObs] {return [DEPObs]()}

var depRefList = fetchDepRefs()
var depObsList = fetchDepObss()

var allDeps: [Datable] = [Datable]()

在这里你可以将depRefList和depObsList中的元素添加到allDeps,一切都会正常工作。

再次编辑:

这是您正在尝试实现的完整工作示例。在这里我使用map函数将给定数组的元素转换为Datable对象

protocol Datable {
    var date: NSDate { get set }
}

struct DEPref: Datable {
   var date: NSDate
}

struct DEPObs: Datable {
   var date: NSDate
}

func fetchDepRefs() -> [DEPref] {return [DEPref]()}
func fetchDepObs() -> [DEPObs] {return [DEPObs]()}

var depRefs = fetchDepRefs()
var depObs = fetchDepObs()

var ref1 = DEPref(date: NSDate())
var obs1 = DEPObs(date: NSDate())

depRefs.append(ref1)
depObs.append(obs1)

var allDeps = depRefs.map{$0 as Datable} + depObs.map{$0 as Datable}


for x in allDeps {
    print("I'm in allDeps array: \(x.date)")
}

答案 1 :(得分:2)

你在iOS上运行Swift 2吗?以下在Swift 3上成功运行。

http://swiftlang.ng.bluemix.net/#/repl/57b13a01133614f70db3347e

protocol Datable {
    var date: NSDate { get set }
}

struct Type1: Datable {
   var date: NSDate
}

struct Type2: Datable {
   var date: NSDate
}

var x : Datable = Type1(date:NSDate())
var y : Datable = Type2(date:NSDate())

var array : [Datable] = [x, y]

var x2 : Datable = Type1(date:NSDate())
var y2 : Datable = Type2(date:NSDate())

array.append(x2)
array.append(y2)

答案 2 :(得分:0)

最简单的方法是使用map

var depRefList: Array<Datable> = fetchDepRefs().map { $0 as Datable }
var depObsList: Array<Datable> = fetchDepObss().map { $0 as Datable }
var allDeps = (depRefList + depObsList)
            .sort { $0.date.timeIntervalSince1970 > $1.date.timeIntervalSince1970 }

由于depRefList[Datable],而fetchDepRefs()[DEPref],因此Thay属于不同的类型,因此将[DEPref]转移到In Google Chrome console:是必要的{1}},[Datable]函数会为您执行此操作。 流动的代码:

map

等于:

var depRefList: Array<Datable> = fetchDepRefs().map { $0 as Datable }