點擊查看源碼git
//初始化結構體 func testInitStruct() { //結構體 類中默認方法 struct Size { //寬 var width = 0.0 //高 var height = 0.0 } //默認初始化 使用的是init()構造方法 var size = Size() //結構體自帶根據成員初始化結構體的功能 size = Size(width: 10, height: 10) print(size) struct Point { var x = 0.0, y = 0.0 //默認初始化 init() { } //經過成員初始化結構體 init(x:Double, y:Double) { self.x = x self.y = y } } //自定義初始化 var point = Point() //調用inin()方法 point = Point(x: 10, y: 10) //調用init(x: Double, y:Double)方法 print(point) /* print (Size #1)(width: 10.0, height: 10.0) (Point #1)(x: 10.0, y: 10.0) */ }
//初始化枚舉 func testInitEnum() { enum CompassPoint:String { case North, South, East, West init(symbol: String) { switch symbol { case "North": self = .North case "South": self = .South case "East": self = .East default: self = .West } } } //直接取值 var compassPoint = CompassPoint.West print(compassPoint) //經過原始值初始化 compassPoint = CompassPoint(rawValue: "North")! print(compassPoint) //經過自定義的初始化方法 compassPoint = CompassPoint(symbol: "North") print(compassPoint) /* print West North North */ }
//初始化類 func testInitClass() { class BaseClass { var name: String? //可選屬性類型 可能爲String或nil init() { print("Food:init()") } convenience init(name: String) { self.init() self.name = name } //省略外部參數 convenience init(_ subName: String) { self.init(name: subName) } } class SubClass: BaseClass { override init() { super.init() //實現父類的init()方法 } } //默認初始化 var user = SubClass() //經過屬性初始化 user = SubClass(name: "XuBaoAiChiYu") //使用init(_ name: String)初始化 user = SubClass("XuBaoAiChiYu") // var name = "" // name = user.name //由於name能夠爲nil。此處會報錯, if let name = user.name { print(name) } /* print Food:init() Food:init() Food:init() XuBaoAiChiYu */ }
//結構體初始化失敗 func testFailableInitStruct() { struct Animal { let species: String init?(species: String) { if species.isEmpty { return nil } self.species = species } } let someCreature = Animal(species: "Giraffe") //someCreature is of type Animal?, not Animal if let giraffe = someCreature { print("\(giraffe.species)") } /* print Giraffe */ }
//枚舉初始化失敗 func testFailableInitEnum() { enum TemperatureUnit:Character { case kelvin = "K", celsius = "C", fahrenheit = "F" init?(symbol: Character) { switch symbol { case "K": self = .kelvin case "C": self = .celsius case "F": self = .fahrenheit default: return nil } } } //經過自定義方法初始化 var unit = TemperatureUnit(symbol: "F") print(unit!) //Fahrenheit unit = TemperatureUnit(symbol: "X") print(unit) //nil //經過原始值初始化 unit = TemperatureUnit(rawValue: "F") print(unit!) //Fahrenheit unit = TemperatureUnit(rawValue: "X") print(unit) //nil /* fahrenheit nil fahrenheit nil */ }
//類初始化失敗 func testFailableInitClass() { class Product { var name: String? init() {} init?(name: String) { self.name = name if name.isEmpty { return nil } } } //可選鏈操做 當bowTie爲真時 執行內部代碼 if let qq = Product(name: "1045214799") { print(qq.name!) } /* Optional("1045214799") */ }
//必須初始化 func testRequiredInit() { class SomeClass { required init() { //子類要調用此方法,必須繼承實現 } } class SomeSubclass: SomeClass { required init() { } init(required:String) { super.init() //這裏調用父類的init()方法 當前類必須實現init()方法 } } }
//使用閉包或函數設置默認屬性 func testSettingDefaultPropertyValueWithClosureOrFunction() { class SomeClass { let someProperty: String = { //create a default value for someProperty inside this closure //someValue must be of the same type as SomeType return "someValue" }() } let c = SomeClass() print(c.someProperty) /* print someValue */ }