0
我有2 structs
只有通過協議相關。我試圖在兩種類型之間進行轉換,因爲它們共享一個協議,但是我得到一個運行時錯誤。僅使用協議在類型之間進行轉換?
這就是我想要做的事:
protocol A {
var id: String { get }
var name: String { get }
var isActive: Bool { get set }
}
struct Entity: A {
let id: String
var name: String
var isActive: Bool
func someFun() {
print("\(name), active: \(isActive)")
}
}
struct ViewModel: A {
let id: String
var name: String
var isActive: Bool
}
let vm = ViewModel(id: "abc", name: "John Doe", isActive: true)
let pt = vm as A
let et = pt as! Entity
print(et.someFun()) //crash
我得到的錯誤是:
Could not cast value of type '__lldb_expr_87.ViewModel' (0x111835638) to '__lldb_expr_87.Entity' (0x111835550).
這是一個真正的無賴,因爲如果我有幾百萬的記錄,我不我想要循環每一個手動轉換一個。我希望能暗中神奇投這樣的:
let entity = vm as A as Entity
let entities = vms as [A] as [Entity]
任何性能敏感的方式來傳遞邊界之間的對象,而不通過每一個循環?
你不能那樣做,因爲協議只保證兩種類型都實現了協議要求。它並不能保證兩種類型都是可以互換的。順便提一下,Swift提供了'map'之類的函數來避免循環(儘管框架使用循環)。 – vadian