Swift面向?qū)ο?/h2>

創(chuàng)建一個(gè)類(lèi)

//類(lèi)名要大寫(xiě)
class Person: NSObject {
    //屬性
    var name: String
    var age: Int
    
    //構(gòu)造函數(shù)
    init(name: String,age: Int) {
        self.name = name
        self.age = age
        super.init()
    }
    
    //方法
    func eat() {
        print("吃")
    }
}

類(lèi)的四種屬性

import UIKit
class Dog: NSObject {
    var name: String = "旺財(cái)"
}

//屬性
//存儲(chǔ)屬性:當(dāng)對(duì)象創(chuàng)建之后屬性一直存在,直到對(duì)象釋放
//計(jì)算屬性:當(dāng)調(diào)用這個(gè)屬性的時(shí)候,臨時(shí)生成一個(gè)值
//可選屬性:屬性是一個(gè)可選值
//懶加載屬性:當(dāng)首次調(diào)用的時(shí)候加載
class Person: NSObject {
    //存儲(chǔ)屬性
    var name: String
    var age: Int
    //計(jì)算屬性
    var kindName: String {
        return "hi\(name)"
    }
    //可選屬性
    var girlFriend: String?
    //懶加載屬性
    lazy var pet: Dog = Dog()
    
    init(name: String,age: Int) {
        self.name = name
        self.age = age
        super.init()
    }
    
    func eat() {
        print("吃")
    }
}
let xiaoming = Person(name: "xiaoming", age: 18)
print("name:\(xiaoming.name),age:\(xiaoming.age),kindName:\(xiaoming.kindName),girlFriend:\(xiaoming.girlFriend),pet:\(xiaoming.pet)")

類(lèi)的構(gòu)造

//swift類(lèi)的構(gòu)造過(guò)程:用類(lèi)來(lái)創(chuàng)建一個(gè)對(duì)象的過(guò)程
//類(lèi)的構(gòu)造過(guò)程,要保證類(lèi)的所有屬性都被正確初始化
//初始化:對(duì)類(lèi)的屬性賦值(存儲(chǔ)屬性)

swift類(lèi)構(gòu)造過(guò)程

//swift類(lèi)的構(gòu)造過(guò)程:先保證自己的存儲(chǔ)屬性被正確初始化,再保證父類(lèi)的存儲(chǔ)屬性被正確初始化(調(diào)用父類(lèi)的構(gòu)造函數(shù))
init(name: String,age: Int) {
        self.name = name
        self.age = age
        //如果下面這句不寫(xiě),系統(tǒng)會(huì)自動(dòng)創(chuàng)建
        super.init()
    }

指定構(gòu)造器

//重載:在一個(gè)類(lèi)中,存在多個(gè)名字一樣的方法,但是參數(shù)的個(gè)數(shù)和名字不一樣

便利構(gòu)造器

//相當(dāng)于OC中的category
//便利構(gòu)造器
//需要用convenience修飾
//先調(diào)用指定構(gòu)造器
extension UILabel {
    convenience init(title: String,fontSize: CGFloat = 13,alignment: NSTextAlignment = .left,textColor: UIColor = UIColor.darkGray,numberOfLines: Int = 0) {
        //調(diào)用指定構(gòu)造器,保證所有的存儲(chǔ)實(shí)型被正確初始化
        self.init()
        //此時(shí)對(duì)象已創(chuàng)建
        self.text = title
        self.font = UIFont.systemFont(ofSize: 13)
        self.textColor = textColor
        self.textAlignment = alignment
        self.numberOfLines = numberOfLines
    }
}
//判斷構(gòu)造條件是否成立,如果成立,就調(diào)用指定構(gòu)造器完成構(gòu)造過(guò)程,如果不成立,就返回nil
//此時(shí)返回的是一個(gè)可選值
 convenience init?(name: String,age: Int) {
        if age > 100 {
            return nil
        }
        self.init(name:name)
    }

KVC構(gòu)造器

//Any: 任何類(lèi)型
//AnyObject: 對(duì)象類(lèi)型
//KVC構(gòu)造函數(shù),是在運(yùn)行時(shí),動(dòng)態(tài)的向?qū)ο蟀l(fā)消息,給對(duì)象的屬性賦值
//setValuesForKeys(dict):遍歷dict,找到dict的key值,逐一給對(duì)象的屬性賦值
//在kvc中,對(duì)于基本的數(shù)據(jù)類(lèi)型,如果設(shè)為可選,不兼容,會(huì)賦值失敗
//如果是基本的數(shù)據(jù)類(lèi)型,我們需要給它附一個(gè)初值
class Person: NSObject {

    var name: String?
    var age: Int = 0
    
    //super.init() 在構(gòu)造函數(shù)中,如果沒(méi)有手動(dòng)添加,則會(huì)自動(dòng)添加在構(gòu)造函數(shù)的最后面
    init(dict: [String: Any]) {
        super.init()
        //對(duì)象此時(shí)已創(chuàng)建
        setValuesForKeys(dict)
    }
    override func setValue(_ value: Any?, forKey key: String) {
        super.setValue(value, forKey: key)
    }
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        //不要調(diào)用super
        print("key:\(key),value:\(String(describing: value))")
    }
}

實(shí)例方法和類(lèi)方法

//實(shí)例方法
    func eat() {
        print("實(shí)例方法")
    }
    //類(lèi)方法
    class func eat() {
        print("類(lèi)方法")
    }

權(quán)限管理

public:公開(kāi),所有的類(lèi)都可以使用,自己封裝一個(gè)庫(kù)的時(shí)候使用
internal:只有在當(dāng)前命名空間可以使用,默認(rèn)的
fileprivate:只有當(dāng)前文件可以使用,在一個(gè)類(lèi)里面,總有一些屬性和方法是不需要公開(kāi)的,私有的屬性和方法,需要使用private來(lái)修飾
private:只有在當(dāng)前類(lèi)可以使用

每一個(gè)框架都是一個(gè)命名空間
在命名空間的內(nèi)部互相引用類(lèi),不需要import
使用框架需要引入框架的名字
對(duì)于不需要公開(kāi)的屬性和方法,需要使用private/fileprivate修飾

屬性觀察器

//: [Previous](@previous)
//屬性觀察器: 監(jiān)控屬性的值的變化
//willSet: 屬性將要賦值時(shí)調(diào)用, 它有一個(gè)默認(rèn)的參數(shù)叫newValue, 可以直接使用
//didSet: 屬性已經(jīng)賦值成功調(diào)用, 它有一個(gè)默認(rèn)的參數(shù)叫oldValue, 可以直接使用
//寫(xiě)法: 在屬性的后面接一個(gè)大括號(hào), didSet和willSet寫(xiě)在大括號(hào)的內(nèi)部
//實(shí)際開(kāi)發(fā)過(guò)程中的使用最廣泛的場(chǎng)景: 給model賦值, 賦值成功后更新UI, 就需要給model添加一個(gè)觀察器.
import Foundation

class Person: NSObject {
    var name: String
    var age: Int = 0
    var weight: Float = 8 {
        //將要給weight賦值
        willSet(newValue) {
            print("====\(newValue)")
        }
        //已經(jīng)給weight賦值成功
        didSet(oldValue) {
            print("====\(oldValue)")
            if weight > 20 {
                print("該減肥了")
            }
            if weight < 5 {
                print("吃")
            }
        }
    }
    init(name: String) {
        self.name = name
        super.init()
    }
}

let p = Person(name: "xiaoming")
print(p.weight)
p.weight = 20

可空鏈?zhǔn)秸{(diào)用

//可空鏈?zhǔn)秸{(diào)用:當(dāng)我們?cè)L問(wèn)一個(gè)可選對(duì)象的屬性時(shí),可以直接使用?,最終會(huì)返回一個(gè)可選值


class House: NSObject {
    
}
class Person: NSObject {
    var house: House?
}

let person: Person? = Person()
let house = person?.house
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容