我有这样的协议:
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] {...}
我想创建一个DEPref
和DEPObs
数组,以便对最终列表进行排序。
我尝试了很多东西,但编译器抱怨。例如:
var depRefList: Array<Datable> = fetchDepRefs()
var depObsList: Array<Datable> = fetchDepObss()
var allDeps = ...
第一行出错 &#34;无法将[DEPref]类型的值转换为指定类型数组&#34;
答案 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]
转移到是必要的{1}},[Datable]
函数会为您执行此操作。
流动的代码:
map
等于:
var depRefList: Array<Datable> = fetchDepRefs().map { $0 as Datable }