[英]Casting generic array in swift cause fatal error
我有一个充当BLL的类,包装了服务协议。 服务协议提供了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 in约束以实现SerializedObjectProtol,即
class DataLayer<T:SerializableObjectProtocol>
T是用户类型。 result
是一个用户数组。 即[User]
我可以解决这个问题,但是我必须手动投射每个项目。 结果,这工作得很好:
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个字节,这对任何协议都适用。 结论:您需要转换每个项目。
也许这样做:
return results.map{ $0 as! User }
或者,如果不确定每个项目是否都是User
,则只能返回User
如下所示:
return results.flatMap{ $0 as? User }
如果仍然有问题,请发布一些仍会产生错误的最小代码,如果没有实际代码,很难理解您的代码是什么样的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.