ios - 快速转换通用数组会导致 fatal error

标签 ios arrays swift generics

我有一个充当 BLL 的类,包装了一个服务协议(protocol)。服务协议(protocol)提供了一个 SerializableObjectProtocol 对象列表。例如,我有 User,它实现了 SerializedObjectProtocol

以下函数将 SerializedObjectProtol 数组转换为 User

public func Get() -> [T]
{
    let result = self._service.Get()

    return result as! [T]
}

因此,我收到以下错误:

 array element cannot be bridged to Objective-C

我知道代码很容易出错,因为如果对象不是 T,就不会发生向下转换。因此,这是我可以验证的:

  • T 受限于实现 SerializedObjectProtol 即

       class DataLayer<T:SerializableObjectProtocol>
    
  • T 是用户类型。 result 是一组用户。即 [用户]

  • 我可以解决这个问题,但我必须手动施放每个项目。结果,这工作得很好:

    var returnArray = [T]()
    
    for item in result
    {
        returnArray.append(item as! T)
    }
    
    return returnArray;
    

我刚刚为一个项目选择了 Swift,所以我对它的经验有限。结果,我出去看看我正在尝试的是否可行(将数组 [S] 转换为 [T])。如果数组是 [Any] 似乎是可能的。

这是 Swift 中的有效操作吗?或者无法以这种方式进行转换。

最佳答案

通常不可能在 Any 数组之间直接转换为它包含的类型,因为 Any 在内存中具有完全不同的表示形式:sizeof (Any) 不等于 sizeof(User)! 10个Any的数组可能有320个字节的长度,但是10个User只需要80个字节,这同样适用于任何协议(protocol)。结论:你需要施放每一个元素。

也许可以这样做:

return results.map{ $0 as! User }

或者如果您不确定每个项目是否都是User,您只能像这样返回User:

return results.flatMap{ $0 as? User }

如果您仍然遇到问题,请发布一些仍然会产生错误的最小代码,如果没有实际代码,真的很难理解您的代码是什么样子

关于ios - 快速转换通用数组会导致 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33537319/

相关文章:

arrays - 等效的非变异数组推送方法

java - 创建构造函数来读取 txt 文件

javascript - 名为 `name` 的数组按行而不是单词打印字符。使用 for 循环

swift - 在两个位置之间随机生成一个 SKSpriteNode

ios - 奇怪的按钮动画

android - iOS/Android 跨平台开发

ios - 线程 1 : EXC_BREAKPOINT CALayer removeAllAnimations message sent to deallocated

ios - appdelegate 如何使用 Storyboard推送 ViewController

ios - 使用 Swift 2.0 添加要解析的图像

ios - 选择集合中不可见的单元格