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
广告