Swift - 擴充套件



什麼是 Swift 中的擴充套件?

Swift 提供了一個稱為擴充套件的特殊功能。擴充套件用於在現有的類、結構體、列舉或協議型別中新增新的功能,而無需覆蓋或修改現有的程式碼。當我們想要擴充套件無法修改的型別的功能(例如第三方庫等)時,此功能非常有用。擴充套件是對型別的靜態新增,而不是動態的。此外,它們不能新增具有預設值的儲存屬性。

以下是擴充套件提供的功能:

  • 新增計算屬性和計算型別屬性

  • 定義例項方法和型別方法

  • 提供新的初始化器

  • 定義下標

  • 定義和使用新的巢狀型別

  • 使現有型別符合協議

在 Swift 中定義擴充套件

擴充套件是藉助 **extension** 關鍵字宣告的。

語法

以下是擴充套件的語法:

extension SomeType {
   // Adding new functionality
}

現有型別也可以透過擴充套件新增,使其成為協議標準,其語法類似於類或結構體。

extension SomeType: SomeProtocol, AnotherProtocol {
   // Describe protocol requirements
}

帶有計算屬性的擴充套件

計算“例項”和“型別”屬性也可以透過擴充套件進行擴充套件。計算屬性是指不儲存值的屬性,而是提供 getter 和 setter 來檢索和設定其他屬性和值。

示例

Swift 程式演示如何使用擴充套件在計算屬性中新增新功能。

// Adding new functionality to the computed property using an extension
extension Int {
   var add: Int {return self + 100 }
   var sub: Int { return self - 10 }
   var mul: Int { return self * 10 }
   var div: Int { return self / 5 }
}
    
let addition = 3.add
print("Addition is \(addition)")
    
let subtraction = 120.sub
print("Subtraction is \(subtraction)")
    
let multiplication = 39.mul
print("Multiplication is \(multiplication)")
    
let division = 55.div
print("Division is \(division)")

let mix = 30.add + 34.sub
print("Mixed Type is \(mix)")

輸出

它將產生以下輸出:

Addition is 103
Subtraction is 110
Multiplication is 390
Division is 11
Mixed Type is 154

帶有初始化器的擴充套件

Swift 提供了使用擴充套件向現有型別新增新初始化器的靈活性。使用者可以新增他們自己的自定義型別來擴充套件已定義的型別,並且還可以提供額外的初始化選項。擴充套件僅支援 init()。deinit() 不受擴充套件支援。

示例

Swift 程式演示如何使用擴充套件在初始化器中新增新功能。

struct sum {
   var num1 = 100, num2 = 200
}
   
struct diff {
   var no1 = 200, no2 = 100
}
   
struct mult {
   var a = sum()
   var b = diff()
}
   
let calc = mult()
print ("Inside mult block \(calc.a.num1, calc.a.num2)")
print("Inside mult block \(calc.b.no1, calc.b.no2)")
   
let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))
 
print("Inside mult block \(memcalc.a.num1, memcalc.a.num2)")
print("Inside mult block \(memcalc.b.no1, memcalc.b.no2)")
   
extension mult {
   init(x: sum, y: diff) {
      let X = x.num1 + x.num2
      let Y = y.no1 + y.no2
   }
}  

let a = sum(num1: 100, num2: 200)
print("Inside Sum Block:\( a.num1, a.num2)")   
   
let b = diff(no1: 200, no2: 100)
print("Inside Diff Block: \(b.no1, b.no2)")

輸出

它將產生以下輸出:

Inside mult block (100, 200)
Inside mult block (200, 100)
Inside mult block (300, 500)
Inside mult block (300, 100)
Inside Sum Block:(100, 200)
Inside Diff Block: (200, 100)

帶有方法的擴充套件

可以使用擴充套件向子類進一步新增新的例項方法和型別方法。

示例

Swift 程式演示如何使用擴充套件在方法中新增新功能。

extension Int {
   func topics(summation: () -> ()) {
      for _ in 0..<self {
         summation() 
      }
   }
}  

4.topics({
   print("Inside Extensions Block")       
})    
    
3.topics({
   print("Inside Type Casting Block")       
})  

輸出

它將產生以下輸出:

Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Type Casting Block
Inside Type Casting Block
Inside Type Casting Block

帶有可變例項方法的擴充套件

我們還可以使用擴充套件向結構體和列舉的可變例項方法中新增新功能。

示例

Swift 程式演示如何使用擴充套件在可變方法中新增新功能。

extension Double {
   mutating func square() {
      let pi = 3.1415
      self = pi * self * self
   }
}

var Trial1 = 3.3
Trial1.square()
print("Area of circle is: \(Trial1)")

var Trial2 = 5.8
Trial2.square()
print("Area of circle is: \(Trial2)")

var Trial3 = 120.3
Trial3.square()
print("Area of circle is: \(Trial3)")

輸出

它將產生以下輸出:

Area of circle is: 34.210935
Area of circle is: 105.68006
Area of circle is: 45464.070735

帶有下標的擴充套件

向已宣告的例項新增新的下標也可以透過擴充套件實現。

示例

Swift 程式演示如何使用擴充套件在下標中新增新功能。

extension Int {
   subscript(var multtable: Int) -> Int {
      var no1 = 1
      while multtable > 0 {
         no1 *= 10
         --multtable
      }
      return (self / no1) % 10
   }
}
    
print(12[0])
print(7869[1])
print(786543[2])

輸出

它將產生以下輸出:

2
6
5

帶有巢狀型別的擴充套件

類、結構體和列舉例項的巢狀型別也可以透過擴充套件進行擴充套件。

示例

Swift 程式演示如何使用擴充套件在巢狀型別中新增新功能。

extension Int {
   enum calc
   {
      case add
      case sub
      case mult
      case div
      case anything
   }

   var print: calc {
      switch self
      {
         case 0:
            return .add
         case 1:
            return .sub
         case 2:
            return .mult
         case 3:
            return .div
         default:
            return .anything
       }
   }
}

func result(numb: [Int]) {
   for i in numb {
      switch i.print {
         case .add:
            print(" 10 ")
          case .sub:
            print(" 20 ")
         case .mult:
            print(" 30 ")
         case .div:
            print(" 40 ")
         default:
            print(" 50 ")

      }
   }
}

result(numb: [0, 1, 2, 3, 4, 7])

輸出

它將產生以下輸出:

10 
20 
30 
40 
50 
50
廣告