swift语法--10构造函数

swift语法--10构造函数


注意
  • Swift开发中一般情况下不用导入头像文件, 因为只要所有的文件都在一个命名空间中那么就可以直接使用
  • 默认情况下一个项目的命名空间就是项目名称, 而在同一个项目下的所有文件都在同一个命名空间中

构造函数

1.如果自定义一个类,并且没有重写构造方法,也没有自定义构造方法,系统会提供默认的构造方法
//创建一个Person类,通过Person()创建对象
let p = Person()
// Person()

//在Person类下重写init方法,重写方法需要在方法前加override
override init() {
    // 当我们重写一个类的构造方法时, 系统内部会自动的帮我们调用super.init()
    super.init()
    print("++++++++")   
}

2.类的成员属性问题

Swift中要求在创建一个类时必须给这个类中所有的属性进行初始化

class Person: NSObject {
    
    //创建成员属性
    var name: String
    var age: Int
    
    //成员属性必须初始化
    override init() {
         //这里是初始化本类
        name = "erer"
        age = 18
        
        //重写类的构造方法时,系统会自动帮我们调用父类的构造方法,即super.init()
        super.init()
        
        //要注意:必须先初始化本类再初始化父类
    }
}

如果不能在创建对象时给这个类中所有的属性进行初始化, 那么这些属性必须是可选的

class Person: NSObject {
    
    //成员属性若不能初始化,需要设置为可选类型
    var name: String?
    var age: Int?
    
}
  • 如果已经在构造方法中对所有的属性进行了初始化, 那么这些属性就可以不是可选类型
  • 如果不能在创建对象时给这个类中所有的属性进行初始化, 那么这些属性必须是可选的
3.属性是对象还是基本数据类型问题
  • 在给某一个类指定属性的数据类型时, 如果该属性是对象类型, 那么可以指定为可选类型
  • 如果该属性不是对象类型而是基本数据类型, 那么建议直接赋值为0
  • 如果属性是基本数据类型, 并且是可选类型, 系统不会自动分配存储空间
class Person: NSObject {
    
    var name: String?  //成员属性是对象类型,设置可选类型
    var age: Int = 0   //成员属性是基本数据类型,直接初始化为0
    //基本数据类型若设置可选类型,系统不会自动分配内存空间
    
}
4.自定义构造方法
class Person: NSObject {   
    var name: String
    var age: Int
    
    init(name: String, age: Int){
        self.name = name
        self.age = age
        
        //super.init()是系统会自动调用的,能不写就不写
        //但如果要写的话,必须写在本类初始化的后面
        //因为先初始化本类,再初始化父类
        //super.init()
    }
}

注意:如果自定义一个类,并且自定义了构造方法,那么系统不会提供默认的构造方法。也就是Person()方法将不自动生成。

5.字典转模型创建构造方法

在开发中,网络请求数据,最多是JSON解析出来的字典,所以使用最多的是字典转模型。

class Person: NSObject {
    
    //创建成员属性
    var name: String
    var age: Int
    
    //自定义构造方法
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    //KVC通过字典给模型属性赋值
    init(dict: [String: AnyObject]) {
        super.init() //出现错误
        setValuesForKeysWithDictionary(dict)
    }
    //这里有一个很严重的错误,字典转模型是通过字典中的key跟模型的属性名匹配,相同就把key对应的value值赋值给属性值。
    //但是由于swift中成员属性必须要初始化,而又不能保证成员属性都能跟字典中的key匹配,所以就不能保证成员属性都能初始化成功
    //因此会报错成员属性未初始化
}

正确做法是使用可选类型,但要注意基本数据类型不能使用可选类型,系统会不分配内存给它的。

class Person: NSObject {
    
    //创建成员属性
    var name: String?
    var age: Int = 0
    
    //KVC通过字典给模型属性赋值
    init(dict: [String: AnyObject]) {
        //Swift中利用KVC转模型前要先调用super.init
        //目的是为了给对象分配内存空间
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
}
6.KVC下调用description方法
//找到description方法
//在协议CustomStringConvertible中,点进去
public protocol CustomStringConvertible {
    /// A textual representation of `self`.
    public var description: String { get }
}

重写description方法

override var description: String {
    return "name = \\(name), age = \\(age)"
    //打印结果  name = Optional("erer"), age = 18
}

通过KVC打印出成员属性值

// Swift中打印对象会调用下面这个属性
override var description: String {

    let property = ["name", "age"]
    let dict = dictionaryWithValuesForKeys(property)
    return "\\(dict)"     
    //将字典通过字符串打印出来
    //打印结果   ["age": 33, "name": "erer"]
    //字典里不能存nil,所以打印出来类型也不是可选类型 
    }
}

你可能感兴趣的:(swift语法--10构造函数)