[英]Downcasting Multidimensional Arrays Swift
我試圖在協議一致類的子類中向下轉換協議要求的多維數組屬性。 但是目前,編譯器在執行此操作時給我一個錯誤。 錯誤是: 'DataClass' is not identical to 'Any'
。
奇怪的是,當屬性簡化為一維數組時,錯誤消失了。 這可能是Swift的錯誤,還是我不了解Swift如何處理多維數組的類型?
自Swift 1.0起就存在這種情況,所以我覺得這里缺少明顯的東西...
我在一個易於測試的代碼片段中再現了我的情況:
protocol MyProtocol {
var myProperty: ([[Any]])! { get set }
func myFuncReturn() -> Any
func myFuncParam(param: Any)
}
class MyClass: MyProtocol {
var myProperty: ([[Any]])!
init(myProperty: ([[Any]])!) {
self.myProperty = myProperty
}
func myFuncReturn() -> Any {
return myProperty[0][0]
}
func myFuncParam(param: Any) { }
}
class MySubclass: MyClass {
var myPropertyOver: ([[DataClass]])! {
return myProperty as? ([[DataClass]])
}
init() {
super.init(myProperty: [[DataClass()]])
}
}
class DataClass { }
謝謝你的幫助!
問題僅僅是您對應該發生的事情不夠具體。 假設您有一個數組數組,有些是DataClass,有些不是。 怎么辦? 您需要在代碼中進行解釋。
當您將[AnyObject]
為[Int]
,這只是簡寫。 真正發生的是Swift遍歷整個數組並測試是否每個元素都可以轉換為Int。
但是您想要做的事情是沒有速記的。 確實,對我(因此對Swift)而言,您要做的事情遠非顯而易見。 你必須明確 。
這樣看。 我們可以將整個示例簡化為以下簡單情況:
var arr = [[AnyObject]]()
arr = [[1],[2]]
var arr2 = [[AnyObject]]()
arr2 = [[1],["howdy"]]
現在,我猜想您想要的是:如果給定數組中的每個數組都是可以轉換為[Int]
的數組,請執行此操作。 如果不是,那么您應該以nil結尾:嘗試失敗。
好的,如果這就是您想要的,那就是您必須要做的 。 沒有魔術的捷徑。 因此,例如:
func cast(array:[[AnyObject]]) -> [[Int]]? {
let result = array.map {
(subarr:[AnyObject]) -> [Int]? in
if let subarr = subarr as? [Int] {
return subarr
} else {
return nil
}
}
var foundnil = false
for subarr in result {
if subarr == nil {
foundnil = true
break
}
}
if foundnil {
return nil
}
return result.map{$0!}
}
這證明它可以正常工作:
cast(arr) // [[1], [2]]
cast(arr2) // nil
如果我不了解您期望的輸出,則只需更改cast
函數即可獲得您期望的輸出。 但這就是重點。 不清楚您想要什么。 您不能僅僅對這種事情投以期望並使其有意義,或者讓Swift讀懂您的想法。 你必須說你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.