Swift 类、结构体的初始化

Swift 类、结构体的初始化,第1张

1、初始化器 初始化器在创建特定类型的实例时被调用
struct Person {
    var name: String
    init() {  //初始化器
        name = "zhangsan"
    }
}
var p = Person()
print("name is \(p.name)")
2、默认的初始化器 Swift 为所有没有提供初始化器的结构体或类提供了一个默认的初始化器来给所有的属性提供 了默认值。这个默认的初始化器只是简单地创建了一个所有属性都有默认值的新实例
//默认的初始化器
class ShopListItem {
    //类中的每个属性都有默认值
    var name: String?
    var quantity = 1
    var purchased = false
}
let item = ShopListItem()
item.name = "lisi"
print("name is \(item.name!), quantity is \(item.quantity), purchased is \(item.purchased)")
3、自定义初始化 可以提供初始化形式参数作为初始化器的一部分,来定义初始化过程中的类型和值的名称。初始化形式参数与函数和方法的形式参数具有相同的功能和语法
//自定义初始化器
struct Number {
    var number: Double
    init(fromSumNumber num: Double) {  //与函数的形式参数具有相同的语法(实际参数标签 + 形式参数)
        number = num + 12.4 + 30.8 + 45.6
    }
    init(fromAverageNumber num: Double) {
        number = (num - 12.4 + 30.8 + 45.6) / 4
    }
}
let number = Number(fromSumNumber: 10.3)
let number2 = Number(fromAverageNumber: 106.0)
print("number is \(number), number2 is \(number2)")
4、在初始化中分配常量属性 在初始化的任意时刻,你都可以给常量属性赋值,只要它在初始化结束时设置了确定的值即可。一旦为常量属性被赋值,它就不能再被修改了
class SurveyQuestion {
    let text: String  //定义了一个常量属性
    var response: String?
    init(text: String) {  //在初始化时为常量属性赋值,这个常量不能再被修改
        self.text = text
    }
    func ask() {
        print(text)
    }
}
let beetQuestion = SurveyQuestion(text: "How about beets?")
beetQuestion.ask()
beetQuestion.response = "I alse like beets.(but not with cheese)"
//beetQuestion.text = "Do you like beets?"   //此时运行报错,不能再修改已经赋值过了的常量属性
5、结构体的成员初始化器 如果结构体类型中没有定义任何自定义初始化器,它会自动获得一个成员初始化器。不同于默认初始化器,结构体会接收成员初始化器即使它的存储属性没有默认值
struct Size {
    var width = 0.0, height = 0.0
}
6、值类型的初始化器委托 初始化器可以调用其他初始化器来执行部分实例的初始化。这个过程,就是所谓的初始化器委托,避免了多个初始化器里冗余代码
struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    init() {}
    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }
    init(center: Point, size: Size) {
        let originX = center.x - (size.width) / 2
        let originY = center.y - (size.height) / 2
        //调用其他初始化器来执行实例的初始化,就叫初始化器委托
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/993921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存