我是 Swift 的新手,正在尝试使用 .map。我的理解是该行为与 Javascript 的行为类似,但也许我没有正确掌握 Swift 语法?
我已经创建了自定义类 CustomItem
的公共(public)数组(它是响应中返回的类型的子类):
public var availableItems: [CustomItem] = []
public static func getAvailableItems(id: String, completion: (items: [CustomItem]) -> ()) -> Void {
DataConnector.getRelated(type: "users", id: id, relationship: "available") { (response) -> Void in
availableItems = (response.data?.map { return $0 as! CustomItem })!
completion(items: availableItems)
}
}
当我在收到响应后使用断点在控制台中执行 po response.data.map { return $0 }
时,我得到:
(lldb) po response.data.map { return $0 }
▿ Optional([<AnSDK.RemoteDataObject: 0x7f8a0b9c16b0>])
▿ Some : 1 elements
▿ [0] : < AnSDK.RemoteDataObject: 0x7f8a0b9c16b0>
所以看起来这部分确实有效,但是当我尝试将数据对象转换为 CustomItem
类时,我得到:
Could not cast value of type 'AnSDK.RemoteDataObject' (0x100abbda0) to 'Project.CustomItem' (0x100882c60).
这是我的 CustomItem
类以防万一:
import AnSDK
public class CustomItem: RemoteDataObject {
var displayName: String = ""
var value: Float = 0.0
var owner: User?
}
如果我不使用 !强制沮丧,我得到:
RemoteDataObject is not convertible to CustomItem [...]
... 在编译器中。
最佳答案
(我真的只是在这里重申 Ben Gottlieb 的回答,但希望更清楚一些,因为我相信有些读者对他的尝试感到困惑。)
信息看起来相当清楚。您收到了一组 AnSDK.RemoteDataObject
。尽我所能从您的输出中看出,这是对象的实际类。您不能只说“它真的是 RDO 的这个子类”,除非它真的是那个子类。查看您的代码,这似乎不太可能。在 AnSDK
的某处,它必须构造一个 CustomItem
,然后恰好将其作为 RemoteDataObject
返回。这似乎不是 getRelated
内部发生的事情。根据您的代码,我怀疑 AnSDK
对 CustomItem
一无所知,那么它是如何构造一个的呢?
有很多方法可以解决这个问题,具体取决于类型的实际含义以及它们的交互方式。 Ben 的解决方案是一个,它基本上创建对象的副本(尽管在那种情况下,没有特别的理由让 CustomItem
成为 RDO
的子类,并且可能不应该不会。)
如果您只想向 RemoteDataObject
添加方法,您可以使用扩展来实现。您不需要创建子类。
关于ios - 使用 .map 将一个类的数组映射到另一个类的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888368/