[英]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.