我是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内部发生的事情。给定您的代码,我怀疑AnSDKCustomItem一无所知,那么它将如何构建呢?

有多种方法可以解决此问题,具体取决于类型是什么以及它们如何交互。 Ben的解决方案是一种解决方案,它基本上创建了该对象的副本(尽管在这种情况下,并没有特别的理由让CustomItem成为RDO的子类,并且可能不应该这样做。)

如果只想向RemoteDataObject添加方法,则可以使用扩展名来实现。您无需创建子类。

08-05 18:28