我是Swift的新手,我正试着用.map来解决问题。我的理解是行为类似于Javascript的行为,但也许我没有正确地确定Swift语法?
我已经创建了一个自定义类CustomItem
的公共数组(它是响应中返回的类型的子类):
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 [...]
...在编译器中。
答案 0 :(得分:1)
(我真的只是在这里重述Ben Gottlieb的答案,但希望有点清楚,因为我相信一些读者对他的尝试感到困惑。)
这个消息似乎很清楚。您收到了AnSDK.RemoteDataObject
的数组。从我的输出中可以看出,这就是对象的实际类。你不能只说“它确实是RDO的子类”,除非确实是那个子类。看看你的代码,这似乎不太可能。 AnSDK
中的某个位置必须构建CustomItem
,然后恰好将其作为RemoteDataObject
返回。这似乎不是getRelated
内部发生的事情。鉴于你的代码,我怀疑AnSDK
对CustomItem
有什么了解,那么它将如何构建一个呢?
有很多方法可以解决这个问题,具体取决于类型的真实含义以及它们之间的交互方式。 Ben的解决方案是一个,它基本上创建了一个对象的副本(尽管在这种情况下,CustomItem
没有特别的理由成为RDO
的子类,并且可能不应该是。{) p>
如果您只想向RemoteDataObject
添加方法,可以使用扩展程序进行添加。您不需要创建子类。