使用.map将一个类的数组映射到另一个类的数组

时间:2016-01-19 22:43:21

标签: ios arrays swift dictionary

我是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 [...] 

...在编译器中。

1 个答案:

答案 0 :(得分:1)

(我真的只是在这里重述Ben Gottlieb的答案,但希望有点清楚,因为我相信一些读者对他的尝试感到困惑。)

这个消息似乎很清楚。您收到了AnSDK.RemoteDataObject的数组。从我的输出中可以看出,这就是对象的实际类。你不能只说“它确实是RDO的子类”,除非确实是那个子类。看看你的代码,这似乎不太可能。 AnSDK中的某个位置必须构建CustomItem,然后恰好将其作为RemoteDataObject返回。这似乎不是getRelated内部发生的事情。鉴于你的代码,我怀疑AnSDKCustomItem有什么了解,那么它将如何构建一个呢?

有很多方法可以解决这个问题,具体取决于类型的真实含义以及它们之间的交互方式。 Ben的解决方案是一个,它基本上创建了一个对象的副本(尽管在这种情况下,CustomItem没有特别的理由成为RDO的子类,并且可能不应该是。{) p>

如果您只想向RemoteDataObject添加方法,可以使用扩展程序进行添加。您不需要创建子类。