簡體   English   中英

向下轉換多維數組Swift

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

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