swift初始化

本文详细介绍了Swift中的初始化过程,包括结构体的初始化、自定义初始化、可选类型初始化、默认构造器、构造器代理以及类的继承和初始化。通过示例展示了如何在不同场景下进行初始化操作,如创建RGB结构体、定义RGB颜色、使用可选类型以及实现自定义构造器等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值