1. 程式人生 > >Swift之關鍵字使用(I)

Swift之關鍵字使用(I)

過去 col ext 四大 包括 class 作用域 錯誤 文件

static和class的使用

static 使用

在非class的類型(包括enum和struct)中,一般使用static來描述類型作用域。在這個類型中,我們可以在類型範圍中聲明並使用存儲屬性,計算屬性和方法。

技術分享圖片
 1 //other
 2 struct Point {  
 3     let x: Double  
 4     let y: Double  
 5     // 存儲屬性  
 6     static let zero = Point(x: 0, y: 0)  
 7     // 計算屬性  
 8     static var ones: [Point] {  
 9         return
[Point(x: 1, y: 1), 10 Point(x: -1, y: 1), 11 Point(x: 1, y: -1), 12 Point(x: -1, y: -1)] 13 } 14 // 類方法 15 static func add(p1: Point, p2: Point) -> Point { 16 return Point(x: p1.x + p2.x, y: p1.y + p2.y) 17 }
18 } ``` 19 > 註意: class修飾的類中不能使用class來存儲屬性的
View Code

class 使用

1  // other
2  class MyClass {
3  class var bar: Bar?
4  }

但是在使用protocol時,要註意會報一種錯誤,如:"class variables not yet supported"

//other
有一個比較特殊的是protocol,在Swift中class、struct和enum都是可以實現protocol的,那麽如果我們想在protocol裏定義一個類型域上的方法或者計算屬性的話,應該用哪個關鍵字呢?答案是使用class進行定義,但是在實現時還是按照上面的規則:在class裏使用class關鍵字,而在struct或enum中仍然使用static——雖然在protocol中定義時使用的是class.
技術分享圖片
 1 //other
 2 protocol MyProtocol {
 3     static func foo() -> String
 4 }
 5 struct MyStruct: MyProtocol {
 6     static func foo() -> String {
 7         return "MyStruct"
 8     }
 9 }
10 enum MyEnum: MyProtocol {
11     static func foo() -> String {
12         return "MyEnum"
13     }
14 }
15 class MyClass: MyProtocol {
16     class func foo() -> String {
17         return "MyClass"
18     }
19 }
View Code

Private、FilePrivate、Public、open

四大屬性的使用範圍圖:

技術分享圖片

private 修飾符

  • 只允許在當前類中調用,不包括 Extension
  • private 現在變為了真正的私有訪問控制
  • 用 private 修飾的方法不可以被代碼域之外的地方訪問

fileprivate 修飾符

  • fileprivate 其實就是過去的 private。
  • 其修飾的屬性或者方法只能在當前的 Swift 源文件裏可以訪問。
  • 即在同一個文件中,所有的 fileprivate 方法屬性都是可以訪問到的。
 1 class A {
 2     fileprivate func test(){
 3         print("this is fileprivate func!")
 4     }
 5 }
 6 
 7 class B:A {
 8     func show(){
 9         test()
10     }
11 }

public 修飾符

  • 修飾的屬性或者方法可以在其他作用域被訪問
  • 但不能在重載 override 中被訪問
  • 也不能在繼承方法中的 Extension 中被訪問

open 修飾符

  open 其實就是過去的 public,過去 public 有兩個作用:

  • 修飾的屬性或者方法可以在其他作用域被訪問
  • 修飾的屬性或者方法可以在其他作用域被繼承或重載 override

Swift之關鍵字使用(I)