簡體   English   中英

在Swift中使用可選值時IF語句錯誤地評估為True

[英]IF Statement Incorrectly Evaluating to True when Using Optional Values in Swift

我已經設置了視圖控制器,以便它們的-viewDidLoad方法即將返回時發送通知。 例如:

class MyViewController: UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        //Do Stuff
        var notificationCenter = NSNotificationCenter.defaultCenter();
        notificationCenter.postNotificationName("AViewControllerDidLoadNotification", object: self);
    }
}

我的AppDelegate類正在偵聽此通知並實現此圖中顯示的方法。 在此處輸入圖片說明

如果圖片未加載,則該方法將視圖控制器發送的通知作為唯一參數,然后測試UIViewControllertitle屬性是否具有非null值。 如果title屬性為非nil,它將記錄標題。

但是,正如您在調試器面板中看到的那樣,視圖控制器的title屬性為nil ,而if語句仍在評估為true

我當然是新來的可選值。 但是我在一個快速的操場上重新創建了這種情況,並且if語句的計算結果為false。 有任何想法嗎?

特殊使用表達式notification.object?.title您陷入一種奇怪的境地,因為notification.object本身並不是UIViewController。 它是一個AnyObject。

現在,AnyObject沒有已知的屬性,因此它沒有title並且您的表達式似乎不應該編譯。 但是,由於來自Objective-C某些特殊情況的特殊要求,實際上您仍然可以詢問AnyObject的屬性。 但是,當您這樣做時,結果本身就是可選的,因為可能不存在這樣的屬性。

因此,您實際上是在測試,不是在測試視圖控制器的title屬性的值,而是在測試此未知對象是否首先具有title屬性。 並且如果實際上它確實具有title屬性,則將該title屬性的值雙重包裝在Optional中。

為了清楚地看到這一點,只需測試以下(愚蠢的)代碼:

let n = NSNotification(name: "Howdy", object: "Hi")
let t = n.object?.title

看看t是什么類型 它不是String? ; 這是一個String?? 那是您的雙包裝Optional。 這意味着如果該對象原來具有title屬性, 它將是一個Optional-wrapping-a-String,但是以防萬一,該值本身已包裝在Optional中。

因此,您的測試不會執行您想要的操作。 做您想做的事,只需說得更簡單明了。 您需要將投object 首先一個UIViewController, 然后檢查其title 像這樣:

func aViewControllerDidLoad(notification:NSNotification) {
    if let vc = notification.object as? UIViewController {
        if vc.title != nil {
            // ...
        }
    }
}

暫無
暫無

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

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