[英]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
類正在偵聽此通知並實現此圖中顯示的方法。
如果圖片未加載,則該方法將視圖控制器發送的通知作為唯一參數,然后測試UIViewController
的title
屬性是否具有非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.