簡體   English   中英

快速轉換通用數組會導致致命錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM