swift 關鍵詞

關鍵詞
  • mutating
    用于修飾協(xié)議中的方法,是因為考慮到在被struct,enum 實現(xiàn)該協(xié)議的方法時,能在該方法中修改 成員變量,而在類中不用特意聲明,是因為在class 中 成員變量對于方法來說都是透明的
    以下代碼中,
    如果協(xié)議方法 不作聲明mutating,會報錯 沒有實現(xiàn)該方法
    如果 struct 和 enum中不聲明 mutating,會報錯,不能修改實例變量
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}
// 定義類 實現(xiàn)該協(xié)議
class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class"
    var anotherProperty: Int = 110
    // 在 class 中實現(xiàn)帶有mutating方法的接口時,不用mutating進行修飾。因為對于class來說,類的成員變量和方法都是透明的,所以不必使用 mutating 來進行修飾
    func adjust() {
        simpleDescription += " Now 100% adjusted"
    }
}
// 定義 struct 實現(xiàn)該協(xié)議
struct SimpleStruct: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription += "(adjusted)"
    }
}
//在 enum 中 實現(xiàn)該協(xié)議
enum SimpleEnum: ExampleProtocol {
    case First, Second, Third
    var simpleDescription: String {
        get {
            switch self {
            case .First:
                return "first"
            case .Second:
                return "second"
            case .Third:
                return "third"
            }
        }

        set {
            simpleDescription = newValue
        }
    }
    
    mutating func adjust() {

    }
}

  • final
    swift4 新增
    可以修飾 class ,fun,var
    被修飾的對象 無法被繼承
  • defer
    會在當前作用域結束時執(zhí)行,執(zhí)行順序為逆序,defer 中捕獲的變量值是可以改變的
  • deinit
    屬于析構函數,析構函數和構造函數相反,當對象結束其聲明周期時,系統(tǒng)自動執(zhí)行析構函數(相當于OC的delloc)
  • associatedtype
    在協(xié)議中除了定位屬性和方法外 ,還可以定義 類型占位符,讓實現(xiàn)協(xié)議的類型 來指定類型
protocol Animal {
    associatedtype F: Food
    func eat(_ food: F)
}

struct Meat: Food { }
struct Grass: Food { }

struct Tiger: Animal {
    func eat(_ food: Meat) {
        print("eat \(food)")
    }
}

struct Sheep: Animal {
    func eat(_ food: Grass) {
        print("eat \(food)")
    }
}

  • subscript
    下標索引修飾,可以讓class,enum,struct使用下標訪問內部值
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
//使用
 let times = TimesTable(multiplier: 3)
 let time = times[3]
  • typealias
    為類型聲明一個別名,和typedef 類似
  • override
    如果我們要重寫某個方法或者某個屬性的話,需要在重寫的變量前增加一個override關鍵字
  • fallthrough
    swift語言特性,switch語句的break 語句可以忽略不寫,滿足條件時直接跳出循環(huán),fallthrough的作用就是執(zhí)行完當前的case,繼續(xù)執(zhí)行下面的case,類似于其他語言中省去break 會繼續(xù)往后一個break跑,直到碰到break 或者default 才完成的效果
 let type: Int = 3
        var name: String = ""
        switch type {
        case 1, 2, 3, 4, 5, 6:
            name += "\(type)"
            fallthrough
        case 8:
            name += "哈哈哈哈"
        case 9:
            name += "嗯~"
        default:
            name += "結束了"
        }
  • inout
    inout 作為函數聲明時,引用傳值的關鍵字。但是在調用的時候引用的是地址,所以在引用的時候要加上&
 func test(a: inout Int, b: inout Int)  {
        let num = a + b
        print(num)
    }
//使用
var a = 3
var b = 5
test(a: &a, b: &b)

  • @discardableResult
    正常的swift 方法 如果有返回值的話,在調用的時候 得有個變量去接收,如果不接收的話 會有警告,如果不想接收 又不想要警告,可以在方法聲明的時候 在方法名上面 加上@discardableResult
image.png

改進:

class PHAssetController: PHBaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        getNumber()
    }

    @discardableResult
    func getNumber() -> Int {
        return 9;
    }
}
訪問關鍵詞
  • private
    只能在當前類被訪問,swift4中,extension里也可以訪問private的屬性
  • filePrivate
    swift3 新增。
    對原來的private 進行細分
    所修飾的屬性或者方法在當前的源文件中可以被訪問
  • open
    swift3新增
    可以在任何地方被訪問,繼承和重寫
    對原來的public進行細分
  • public
    可以在任何地方被訪問,在其他模塊中不能被繼承和重寫
  • internal
    默認關鍵字,可以在本模塊內任意被訪問
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容