我有一个充当 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/