Swift:将对象数组转换为子类型数组

Swift:将对象数组转换为子类型数组,第1张

概述说我有一系列动物,我想将它投射到一系列的猫.在这里,Animal是Cat采用的协议.我喜欢让猫吃的东西:[猫] =动物! [Cat]但这个seg在编译时出错(顺便说一句,我在 Linux Swift 3和Mac Swift 2.2上).我的解决方法是创建一个单独向下转换每个项目并将其添加到新数组的函数(请参阅下面的小示例).它会产生预期的效果,但不像我想的那样干净. 我的问题是: >这是完全愚蠢的 说我有一系列动物,我想将它投射到一系列的猫.在这里,Animal是Cat采用的协议.我喜欢让猫吃的东西:[猫] =动物! [Cat]但这个seg在编译时出错(顺便说一句,我在 Linux Swift 3和Mac Swift 2.2上).我的解决方法是创建一个单独向下转换每个项目并将其添加到新数组的函数(请参阅下面的小示例).它会产生预期的效果,但不像我想的那样干净.

我的问题是:

>这是完全愚蠢的,我只是错过了一个更简单的方法吗?
>如何在下面的函数中传递一个类型作为目标参数,而不是传递实例? (例如,我想传递Cat.self而不是Cat(ID:0),但这样做会导致错误,说无法将Cat.Type转换为预期的参数类型Cat)

这是我到目前为止所拥有的:

protocol Animal: customstringconvertible {    var specIEs: String {get set}    var ID: Int {get set}}extension Animal{    var description: String     {        return "\(self.specIEs):\(self.ID)"    }}class Cat: Animal {    var specIEs = "felis catus"    var ID: Int    init(ID: Int)    {        self.ID = ID    }}func convertArray<T,U>(_ array: [T],_ target: U) -> [U]{    var newArray = [U]()    for element in array    {        guard let newElement = element as? U else        {            print("downcast Failed!")            return []        }        newArray.append(newElement)    }    return newArray}let animals: [Animal] = [Cat(ID:1),Cat(ID:2),Cat(ID:3)]print(animals)print(animals.dynamicType)// ERROR: cannot convert value of type '[Animal]' to specifIEd type '[Cat]'// let cats: [Cat] = animals// ERROR: seg fault// let cats: [Cat] = animals as! [Cat]let cats: [Cat] = convertArray(animals,Cat(ID:0))print(cats)print(cats.dynamicType)
解决方法
Am I missing an easIEr way to do this?

您可以使用map进行转换:

let cats: [Cat] = animals.map { 
how can I pass a type as the target parameter in the function below,rather than passing an instance?
as! Cat }
func convertArray<T,U>(array: [T]) -> [U] {    var newArray = [U]()    for element in array {        guard let newElement = element as? U else {            print("downcast Failed!")            return []        }        newArray.append(newElement)    }    return newArray}

首先,您需要删除实例参数:

let cats: [Cat] = convertArray(animals)

由于您无法显式指定类型参数,因此需要为编译器提供一些信息以推断U的类型.在这种情况下,您需要做的就是将结果分配给Cat数组:

总结

以上是内存溢出为你收集整理的Swift:将对象数组转换为子类型数组全部内容,希望文章能够帮你解决Swift:将对象数组转换为子类型数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1005167.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存