我是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 [...]
...在编译器中。
最佳答案
(我实际上只是在这里重申本·戈特利布的答案,但希望可以更清楚一点,因为我相信有些读者对他的尝试感到困惑。)
该消息似乎很清楚。您已经收到了AnSDK.RemoteDataObject
数组。尽我所能从输出中看出,这是对象的实际类。您不能只说“它确实是RDO的这个子类”,除非它确实是那个子类。查看您的代码,这似乎不太可能。在AnSDK
中的某个地方,必须构造一个CustomItem
,然后恰好将其作为RemoteDataObject
返回。这似乎不是getRelated
内部发生的事情。给定您的代码,我怀疑AnSDK
对CustomItem
一无所知,那么它将如何构建呢?
有多种方法可以解决此问题,具体取决于类型是什么以及它们如何交互。 Ben的解决方案是一种解决方案,它基本上创建了该对象的副本(尽管在这种情况下,并没有特别的理由让CustomItem
成为RDO
的子类,并且可能不应该这样做。)
如果只想向RemoteDataObject
添加方法,则可以使用扩展名来实现。您无需创建子类。