Swift 扩展

简介: Swift 扩展

扩展就是向一个已有的类、结构体或枚举类型添加新功能。

扩展可以对一个类型添加新的功能,但是不能重写已有的功能。

Swift 中的扩展可以:

  • 添加计算型属性和计算型静态属性
  • 定义实例方法和类型方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个协议

语法

扩展声明使用关键字 extension

extension SomeType {

   // 加到SomeType的新功能写到这里

}

一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议,语法格式如下:

extension SomeType: SomeProtocol, AnotherProctocol {

   // 协议实现写到这里

}


计算型属性

扩展可以向已有类型添加计算型实例属性和计算型类型属性。

实例

下面的例子向 Int 类型添加了 5 个计算型实例属性并扩展其功能:

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)")

   

let subtraction = 120.sub

print("减法运算后的值:\(subtraction)")

   

let multiplication = 39.mul

print("乘法运算后的值:\(multiplication)")

   

let division = 55.div

print("除法运算后的值: \(division)")


let mix = 30.add + 34.sub

print("混合运算结果:\(mix)")

以上程序执行输出结果为:

加法运算后的值:103

减法运算后的值:110

乘法运算后的值:390

除法运算后的值: 11

混合运算结果:154


构造器

扩展可以向已有类型添加新的构造器。

这可以让你扩展其它类型,将你自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。

扩展可以向类中添加新的便利构造器 init(),但是它们不能向类中添加新的指定构造器或析构函数 deinit() 。

struct sum {

   var num1 = 100, num2 = 200

}


struct diff {

   var no1 = 200, no2 = 100

}


struct mult {

   var a = sum()

   var b = diff()

}



extension mult {

   init(x: sum, y: diff) {

       _ = x.num1 + x.num2

       _ = y.no1 + y.no2

   }

}



let a = sum(num1: 100, num2: 200)

let b = diff(no1: 200, no2: 100)


let getMult = mult(x: a, y: b)

print("getMult sum\(getMult.a.num1, getMult.a.num2)")

print("getMult diff\(getMult.b.no1, getMult.b.no2)")

以上程序执行输出结果为:

getMult sum(100, 200)

getMult diff(200, 100)


方法

扩展可以向已有类型添加新的实例方法和类型方法。

下面的例子向Int类型添加一个名为 topics 的新实例方法:

extension Int {

  func topics(summation: () -> ()) {

     for _ in 0..<self {

        summation() 

     }

  }

}  


4.topics({

  print("扩展模块内")      

})    

   

3.topics({

  print("内型转换模块内")      

})  

以上程序执行输出结果为:

扩展模块内

扩展模块内

扩展模块内

扩展模块内

内型转换模块内

内型转换模块内

内型转换模块内

这个topics方法使用了一个() -> ()类型的单参数,表明函数没有参数而且没有返回值。

定义该扩展之后,你就可以对任意整数调用 topics 方法,实现的功能则是多次执行某任务:


可变实例方法

通过扩展添加的实例方法也可以修改该实例本身。

结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样。

实例

下面的例子向 Swift 的 Double 类型添加了一个新的名为 square 的修改方法,来实现一个原始值的平方计算:

extension Double {

  mutating func square() {

     let pi = 3.1415

     self = pi * self * self

  }

}


var Trial1 = 3.3

Trial1.square()

print("圆的面积为: \(Trial1)")



var Trial2 = 5.8

Trial2.square()

print("圆的面积为: \(Trial2)")



var Trial3 = 120.3

Trial3.square()

print("圆的面积为: \(Trial3)")

以上程序执行输出结果为:

圆的面积为: 34.210935

圆的面积为: 105.68006

圆的面积为: 45464.070735


下标

扩展可以向一个已有类型添加新下标。

实例

以下例子向 Swift 内建类型Int添加了一个整型下标。该下标[n]返回十进制数字

extension Int {

   subscript(multtable: Int) -> Int {

       var powerOf10 = 1

       var index = multtable

       while index > 0 {

           powerOf10 *= 10

           index -= 1

       }

       return (self / powerOf10) % 10

   }

}


print(12[0])     // 输出:2

print(7869[1])   // 输出:6

print(786543[2]) // 输出:5

以上程序执行输出结果为:

2

6

5


嵌套类型

扩展可以向已有的类、结构体和枚举添加新的嵌套类型:

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([0, 1, 2, 3, 4, 7])

以上程序执行输出结果为:

10 

20 

30 

40 

50 

50

目录
相关文章
|
存储 Swift iOS开发
31 Swift 继续聊聊协议扩展
Swift 继续聊聊协议扩展
116 0
|
1月前
|
Swift 索引 容器
Swift 泛型-扩展泛型类型
Swift 泛型-扩展泛型类型
29 2
|
4月前
|
存储 编译器 Swift
Swift笔记:Swift中的扩展语法
Swift笔记:Swift中的扩展语法
121 1
|
6月前
|
存储 Swift 索引
Swift开发——索引器扩展
扩展用于向已存在的类型(例如,类、结构体、枚举和协议等)中添加新的功能,扩展甚至可以向系统类型(包括无法查阅代码的类型)中添加新的功能,但是扩展不能覆盖原类型中已有的方法,扩展也不能向类中添加新的存储属性。
60 6
Swift开发——索引器扩展
|
7月前
|
存储 设计模式 安全
【Swift开发专栏】Swift的扩展与分类
【4月更文挑战第30天】Swift的扩展和枚举分类提供类型添加新功能的灵活性。文章分为三部分:扩展用于为已有类型添加属性、方法等,适用于功能扩展、代码组织;枚举分类定义相关值,支持原始值和关联值,用于状态表示和类型安全选项。扩展和分类在实际开发中应用于类型增强、状态管理及组合使用。了解并掌握这些特性,能提升代码的灵活性和可维护性。更多高级特性和应用值得进一步探索。
99 2
|
Swift
Swift之UIView的扩展
Swift之UIView的扩展
172 0
Swift之UIView的扩展
|
存储 前端开发 Swift
Swift实用小册19:Extension扩展的使用
在本章中,你将学会Extension扩展的使用方法。
406 0
Swift实用小册19:Extension扩展的使用
|
存储 编译器 Swift
Swift5.0 - day7-扩展、访问控制、内存管理
Swift5.0 - day7-扩展、访问控制、内存管理
179 0
Swift5.0 - day7-扩展、访问控制、内存管理
Swift5.1—扩展协议和默认实现
Swift5.1—扩展协议和默认实现
358 0
|
存储 Swift iOS开发
Swift5.1—扩展
Swift5.1—扩展
128 0