资讯详情

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

三、构造器

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(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

七、嵌套类型

  • 扩展可以向已有的类、结构体和枚举添加新的嵌套类型:
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 

标签: sub灯具电线连接器扩口连接热浸塑电缆穿线钢管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台