2016-03-01 130 views
2

我創造了示例應用程序用於測試failable初始化。當我伸出NSObject的,然後我得到下面的錯誤。雨燕2.1:獲取錯誤而延長NSObject的

1)屬性'self.userName'未在super.init調用時初始化。
2) 不可變值「self.userDetails」可以僅進行一次初始化。
3) 不可變值「self.userName」可以僅進行一次初始化。

請找到下面的代碼和屏幕截圖是相同的。

class User: NSObject { 

    let userName: String! 
    let userDetails: [String]? 

    init?(dictionary: NSDictionary) { 
     super.init() 

     if let value = dictionary["user_name"] as? String { 
      self.userName = value 
     } 
     else { 
      return nil 
     } 

     self.userDetails = dictionary["user_Details"] as? Array 
    }   
} 

截圖

enter image description here

回答

1

所有屬性必須初始化之前super.init()

無必須從failable初始化器super.init()後返還。這種限制should be removed in Swift 2.2

正確的執行將是:

class User: NSObject { 

    let userName: String! 
    let userDetails: [String]? 

    init?(dictionary: NSDictionary) { 
     if let value = dictionary["user_name"] as? String { 
      self.userName = value 
     } else { 
      self.userName = nil 
     } 

     self.userDetails = dictionary["user_Details"] as? Array 

     super.init() 

     if userName == nil { 
      return nil 
     } 

     else if userDetails == nil { 
      return nil 
     } 
    } 
} 
+0

可不可以給其中指出,failable初始化器從2.2迅速刪除的鏈接? –

+0

在2.2將被刪除未保釋初始化劑,但第二限制 – Silmaril

+0

https://github.com/apple/swift/blob/swift-2.2-SNAPSHOT-2015-12-18-a/CHANGELOG.md – Silmaril

1
import Foundation 

let dictionary = ["user_name": "user", "user_Details":[1,2,3]] 

class User: NSObject { 

    var userName: String? 
    var userDetails: [String]? 

    init?(dictionary: NSDictionary) { 
     super.init() 
     if let value = dictionary["user_name"] as? String { 
      self.userName = value 
     } 
     else { 
      return nil 
     } 

     self.userDetails = dictionary["user_Details"] as? Array 
    }   
} 

let c = User(dictionary: dictionary) 
dump(c) 
/* 
▿ User 
    ▿ Some: User #0 
    - super: <__lldb_expr_31.User: 0x7fe372f15860> 
    ▿ userName: user 
     - Some: user 
    - userDetails: nil 
*/