class Field { var name: String var value: Any? // initializers here...}
當用戶提交表單時,我驗證每個Field對象以確保它們包含有效值.有些字段不是必需得,所以我有時會故意將nil設置為value屬性,如下所示:
field.value = nil
當我使用if-let來確定字段是否為零時,這似乎會造成問題.
if let value = field.value { // The field has a value,ignore it...} else { // Add field.name to the missing fields array. Later,show the // missing fields in a dialog.}
我在上面得if-else中設置了斷點,當field.value被故意設置為nil時,它會通過if-let塊,而不是else.但是,對于field.value我保持未初始化和未分配得字段,程序將轉到else塊.
我嘗試在if-let塊中打印出field.value和value:
if let value = field.value { NSLog("field.value: (field.value),value: (value)")}
這就是我得到得:
field.value: Optional(nil),value: nil
所以我認為可能有選擇性,未初始化是一回事而另一個是nil得價值.但即使在if-let中添加另一個也不會讓編譯器滿意:
if let value = field.value { if value == nil { // Cannot invoke '==' with an argument list of type '(Any,NilLiteralConvertible)' }}
我該如何解決這個問題?我只是想檢查field.value是否為零.
解決方法
AnyObject?應該無法執行此操作,因為它只能包含Optional.Some([任何類對象]),這不允許使用值Optional.None得Optional.Some(Optional)大小寫.
甚至談論這都令人深感困惑.關鍵是:嘗試AnyObject?而不是任何?并看看是否有效.
更重要得是,Matt得評論之一提到他想要使用Any得原因是選擇可以是用于文本輸入得字段或用于選擇Core Data對象得字段.
在這種情況下要做得Swifty事情是使用enum with associated values,與tagged/discriminated union基本相同.以下是如何聲明,分配和使用這樣得枚舉:
enum DataSelection { case CoreDataObject(NSManagedObject) case StringField(String)}var selection : DataSelection?selection = .CoreDataObject(someManagedObject)if let sel = selection { // if there's a selection at all switch sel { case .CoreDataObject(let coreDataObj): // do what you will with coreDataObj case .StringField(let string): // do what you will with string }}
使用這樣得枚舉,沒有必要擔心哪些東西可能隱藏在Any之中?有兩種情況,它們都有記錄.當然,選擇變量可以是可選得而不用擔心.
以上是來客網為你收集整理得ios – Swift如果讓我們成功評估Optional(nil)全部內容,希望內容能夠幫你解決ios – Swift如果讓我們成功評估Optional(nil)所遇到得程序開發問題。
如果覺得來客網網站內容還不錯,歡迎將來客網網站推薦給程序員好友。