swift初始化

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 } }



posted @ 2017-06-29 08:17  yxysuanfa  阅读(248)  评论(0编辑  收藏  举报