美文网首页
Swift学习笔记十之构造过程

Swift学习笔记十之构造过程

作者: 克鲁德李 | 来源:发表于2017-01-10 16:39 被阅读0次

    1、构造过程:通过自定义构造器对类、结构体、枚举的实例进行初始化操作

    //构造器类似于不带参数的构造方法
    struct Weather {
        var temperature: Double//也可以直接设置默认属性
        init() {               //不带参数的构造器:init(){构造过程}
            temperature = 26.0//在构造器中给存储属性赋值
        }
        
    }
    
     let w = Weather()//初始化过程中会调用构造方法
            print(w.temperature)//26.0
    

    2、自定义构造过程

    struct Point {
    var x = 2.0,y = 4.0 //原始位置
    let z: Double //定义一个常量
    //pointX参数内部名称在构造方法内部使用,外部名称在使用构造方法的时候使用
    init(fromPointX pointX: Double,_ pointY: Double) {// _表示省略外部参数
    x += pointX
    y += pointY
    z = pointX //常量在构造过程中被赋值后不可更改
    }
    //如果没有提供外部名称,swift会自动生成一个和内部名称相同的外部名
    }

    let point = Point.init(fromPointX: 2.0, 3.0)
    print("x:(point.x),y:(point.y)")
    3、默认构造器:如果结构体和类的所有属性都有默认值,同时没有自定义构造器,swift会提供一个默认构造器
    class List {
    var name : String?//可选类型默认设置为nil
    var quantity = 1
    var purchased = false
    }
    let item = List()
    print("(item.name) (item.quantity) (item.purchased)")
    4、值类型的构造代理:构造器调用其它构造器来完成部分实例化
    struct RectSize {
    var width = 0.0,height = 0.0
    }

    struct RectPoint {
    var x = 0.0 ,y = 0.0
    }

    struct Rect {
    var origin = RectPoint()
    var size = RectSize()
    init() {
    }

    init(origin: RectPoint,size: RectSize) {
        self.origin = origin
        self.size = size
    }
    init(center: RectPoint,size: RectSize) {
        let originX = center.x - (size.width/2)
        let originY = center.y - (size.height/2)
        
        self.init(origin: RectPoint(x:originX,y:originY),size: size)
        
    }    
    

    }
    let basicRect = Rect() //x,y,width,height都为0.0
    let originRect = Rect(origin:RectPoint(x:2.0,y:2.0),size: RectSize(width:2.0,height:2.0))
    let centerRect = Rect(center: RectPoint(x:3.0,y:3.0),size: RectSize(width: 2.0,height: 2.0))

    5、类的构造:类的所有属性包括继承父类的都必须在构造过程中设置初始值,类有两种构造器指定构造器和遍历构造器

    init(参数){ //指定构造器语法,初始化类中提供的所有属性
    //初始语句//会调用父类的构造器来实现父类的初始化
    }//所有类都必须拥有父类构造器,但也能通过继承获得

    convenience init(参数){//遍历构造器语法,init前加关键字convenience
    //初始语句 //比较次要的,一般使用类的构造过程更清晰明了
    }
    //子类的指定构造器会调用父类的指定构造器,便利构造器必须调用该类的指定构造器

    6、构造器的继承和重写
    class Vehicle {
    var wheels = 1 //定义一个提供默认值的存储属性
    var description: String{ //返回String的计算属性
    return "有(wheels)个轮子"
    }

    }

    class Bicycle: Vehicle {
    override init(){
    super.init()
    wheels = 2
    }
    }

    let vehicle = Vehicle() //系统会提供指定构造器创建wheels为0的实例属性
    print(vehicle.description)//有一个轮子

        let bicycle = Bicycle()
        print(bicycle.description)//有两个个轮子
    

    7、指定构造器和便利构造器的实践
    class Food {
    var name: String
    init(name: String) {//指定构造器
    self.name = name
    }
    convenience init() {//便利构造器,横向调用指定构造器
    self.init(name: "名字未知")
    }

    }

    let nameMeat = Food(name: "Becon")
    print(nameMeat.name)//Becon
    let unknownMeat = Food()//会调用没有参数的便利构造器
    print(unknownMeat.name)

    class Recepe: Food {
    var quantity: Int
    init(name: String, quantity: Int) {//指定构造器
    self.quantity = quantity //初始化属性
    super.init(name: name) //初始化父类属性
    }
    override convenience init(name: String) {//便利构造器重写了父类的指定构造器
    self.init(name: name,quantity: 1)//调用指定构造器,quantity默认值为1
    }

    }
    class Recepe: Food {
    var quantity: Int
    init(name: String, quantity: Int) {//指定构造器
    self.quantity = quantity //初始化属性
    super.init(name: name) //初始化父类属性
    }
    override convenience init(name: String) {//便利构造器重写了父类的指定构造器
    self.init(name: name,quantity: 1)//调用指定构造器,quantity默认值为1
    }

    }

    let recepe1 = Recepe()
    print("(recepe1.name),(recepe1.quantity)") // 名字未知,1
    let recepe2 = Recepe(name: "Beef")
    print("(recepe2.name),(recepe2.quantity)") // Beef,1
    let recepe3 = Recepe(name: "Egg", quantity: 3)
    print("(recepe3.name),(recepe3.quantity)") // Egg,3

    8、可失败构造器:类,结构体,或枚举在定义的时候有可能失败,可以定义可失败构造器
    struct Animal {
    let species: String
    init?(species: String) { //可失败构造器语法:init?(参数){}
    if species.isEmpty { return nil }
    self.species = species
    }

    }

    let cat = Animal(species: "Cat")//失败构造器会创建一个类型为自身的可选类型对象
    print(cat) //Optional(Animal(species: "Cat"))
    let someAnimal = Animal(species: "") //传入空字符串会导致构造失败
    print(someAnimal)

    enum Unit {//枚举类型的可失败构造器
    case Alex, Bill, Carle
    init?(char: Character) {
    switch char {
    case "A":
    self = .Alex
    case "B":
    self = .Bill
    case "C":
    self = .Carle
    default:
    return nil
    }
    }
    }

    9、必要构造器:子类必须实现的构造器
    class SomeClass{
    required init() {//添加required修饰符表示该类的子类都必须实现该构造器
    //构造器内部实现
    }
    }

    class SubClass: SomeClass {//此时重写父类的指定构造器时,就不需要添加override修饰符
    required init() { //子类也需要添加required,来应用当前类的子类

    }
    

    }

    相关文章

      网友评论

          本文标题:Swift学习笔记十之构造过程

          本文链接:https://www.haomeiwen.com/subject/pldkbttx.html