swift初始化 class INIT: NSObject { // 一个结构体的初始化 // 1、存储属性的初始化 struct Fahrenheit { var temperature :Double init(){ temperature = 32.0 } } func createTemperature(){ var myTemperature = Fahrenheit() println("The default temperature is \(myTemperature.temperature)° Fahrenheit") } // 2、自定义初始化(Customizing Initialization) struct Celeius { var temperatureInCelsius: Double = 0.0 init(fromFahrenheit fahrenheit: Double){ temperatureInCelsius = (fahrenheit - 32.0) / 1.8 } init(fromKevi keviValue: Double){ temperatureInCelsius = keviValue - 273.15 } } func createCeleius(){ var celeius = Celeius(fromFahrenheit: 25.0) println("The tempeture is \(celeius.temperatureInCelsius)") } // 3. 定义一个RGB结构体 struct Color { var red = 0.0,green = 0.0,blue = 0.0 init(red: Double,green: Double,blue: Double){ self.red = red self.green = green self.blue = blue } } func createColor(){ var myColor = Color(red: 0.4,green: 0.6,blue: 0.8) } } class NetWorkManager: NSObject { // 4.可选类型初始化,,可选型不需要初始化,反之必须初始化 let name: String var response: String? init(name: String){ self.name = name } func ask(){ println("== \(self.name)") } } // 5、默认构造器 class ShoppingListItem{ var name: String? var price: Float = 5.4 var isPurse = false // 默认生成的初始化方法 let pictureSize = MySize(width: 5.0,height: 6.0) } struct MySize { var width: Double = 0.0 var height: Double = 0.0 } /** * 6. 数值类型的构造器代理 在实例的初始化过程中,构造器可以调用其他的构造器来完成初始化。这个过程叫构造器代理, 可以避免多个构造器的重复代码。 */ struct MyPoint { var pointX: Double = 0.0,ponintY :Double = 0.0 } struct MyStruct { var origin = MyPoint() var size = MySize() init(){} init(origin: MyPoint,size: MySize){ self.origin = origin self.size = size } init(center: MyPoint,size: MySize){ let centerX = center.pointX - size.width/2 let centerY = center.ponintY - size.height/2 // 这里使用了另一个构造器 self.init(origin:MyPoint(pointX: centerX,ponintY: centerY),size:size) } } /** * 5、类的继承和初始化 1、自定义初始化方法要先调用自己类默认初始化方法,自己重写默认初始化方法要先调用父类默认初始化方法 2、应该要先调用父类的构造器或者自身的默认构造器,以防止先给属性赋值了然后才调用父类或者自身的默认构造器把以前的赋值覆盖了 指定构造器和便捷构造器 指定构造器是一个类最主要的构造器。指定构造器通过设置所有属性的初值并且调用所有的父类构造器来根据构造链一次初始化所有的属性。 类所拥有的指定构造器很少,一般只有一个,并且是连接这父类的构造链依次完成构造的。 每个类至少有一个指定构造器,在有些情况下,需要使用继承来从父类中得到该指定构造器,更多内容可以查看后面的Automatic Initializer Inheritance章节。 便捷构造器是类的第二种常用构造器。你可以调用同一个类中的指定构造器来定义一个便捷构造器,使用指定构造器来设置相关的参数默认值。你还可以定义一个便捷构造器来创建这个类的实例或者是别的特殊用途。 如果你的类不需要它们,也可以不定义便捷构造器。不过对于常见初始化模型需要快捷方式的时候创建一个便捷构造器可以让你的初始化过程变成十分简单便捷。 为了简化指定构造器和便捷构造器的关系,Swift为两种构造器的代理调用设置了三个规则: 规则1:指定构造器必须调用它直接父类的指定构造器 规则2:便捷构造器只能调用同一个类中的其它构造器 规则3:便捷构造器必须以调用一个指定构造器结束 指定构造器必须向上代理 便捷构造器必须横向代理 Unlike methods,properties,and subscripts,you do not need to write the override keyword when overriding an initializer. */ class Food{ /** 指定构造器 init(params) { } 便捷构造器 convenience init(params) { } */ // 指定构造器,因为它保证了每一个Food实例的属性都被初始化了。由于它没有父类,所以不需要调用super.init()构造器。 var name: String init(foodName: String ) { self.name = foodName } // 便捷构造器init(),这个构造器没有参数,仅仅只是将name设置为了[Unnamed] convenience init() { self.init(foodName: "[Unnamed]") } } class RecipeIngredient: Food { var quantity: Int // 定构造器init(name: String,quantity:Int),用来创建一个新的RecipeIngredient实例。在这个指定构造器中它调用了父类的指定构造器init(name:String)。 init(name:String,quantity: Int){ self.quantity = quantity super.init(foodName: name) } // 咋么会需要 override? // 便捷构造器,init(foodName),它使用了同一个类中的指定构造器。当然它还包括一个继承来的默认构造器init(),这个构造器将使用RecipeIngredient中的init(name: String)构造器。 convenience override init(foodName: String) { self.init(name: foodName,quantity: 1) } } // hoppingListItem没有定义构造器来初始化purchased的值,因为每个商品在买之前purchased都是默认被设置为没有被购买的。 // 因为ShoppingListItem没有提供其他构造器,那么它就完全继承了父类的构造器 class ShoppingList: RecipeIngredient { var purchased = false // 闭包 var description: String { var output = "\(quantity) x \(name.lowercaseString)" output += purchased ? " yes" : " no" return output } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。