簡體   English   中英

Swift 5:如何測試 AnyObject? 它的值類型的變量?

[英]Swift 5: How to test an AnyObject? variable for it's value's type?

我目前正在將 iOS 應用程序從 Objective-C 移植到 Swift。 在這樣做時,我偶然發現了一個我正在努力解決的問題。

我有一個可以設置為 AnyObject 的變量(“值”),尤其是它可以是 String、Array、Dictionary 和 Set 類型。 現在,在我之前的代碼中,我正在測試我的“值”變量的值類型,以便進一步使用它:

id value = [myDatahandler getValue];

if (([value isKindOfClass:[NSSet class]] || [value isKindOfClass:[NSArray class]]) && [value count] > 0) {
        // do something
}

嘗試在 Swift 中做同樣的事情似乎不起作用......

var value: AnyObject? = myDatahandler.getValue()

if (value is Set || value is Array) && value!.count > 0 {
        // Error:
        // Generic parameter 'Element' could not be inferred in cast to 'Array'
        // Generic parameter 'Element' could not be inferred in cast to 'Set'
}

經過幾個小時尋找正確的方法來做到這一點,但沒有找到任何有用的東西,我希望社區可以在這里拯救我......

有什么建議可以如何工作嗎?

我覺得您可以使用警衛來執行此操作。希望以下代碼有效。

guard let value =  myDatahandler.getValue() as? [Element] , value.count > 0 else {
    return
}

print(value)

使用Any而不是AnyObject因為來自HackingWithSwift 頁面

AnyObject 指的是 class 的任何實例,相當於 Objective-C 中的 id。 當您特別想使用引用類型時,它很有用,因為它不允許使用 Swift 的任何結構或枚舉。 當您想要限制協議以使其只能與類一起使用時,也可以使用 AnyObject。

Any 指的是 class、結構或枚舉的任何實例——實際上是任何東西。 您將在 Swift 中看到這一點,其中類型未知或以可以有意義分類的方式混合:

然后,您可以使用保護來解開可選值

guard let value =  myDatahandler.getValue() as? [YourClass], !value.isEmpty {
   return
}

問題是SetArray都是泛型類型。 您必須提供元素類型。

例如,如果您希望它們包含Strings

if (value is Set<String> || value is Array<String>) && value!.count > 0 {

}

如果您只關心它是一個數組或集合(並且您不關心元素類型),您可以使用Any作為元素類型:

if (value is Set<Any> || value is Array<Any>) && value!.count > 0 {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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