
我的问题是:
>这是完全愚蠢的,我只是错过了一个更简单的方法吗?
>如何在下面的函数中传递一个类型作为目标参数,而不是传递实例? (例如,我想传递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:将对象数组转换为子类型数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)