gpt4 book ai didi

Swift 对象数组符合协议(protocol)

转载 作者:搜寻专家 更新时间:2023-11-01 06:05:23 26 4
gpt4 key购买 nike

我有这样的协议(protocol):

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 = ...

第一行错误“无法将 [DEPref] 类型的值转换为指定类型的数组”

最佳答案

我是 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)")
}

关于Swift 对象数组符合协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38947734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com