Latest web development tutorials

Swift расширение

Это является расширение существующего класса, структуры или тип перечисления для добавления новых возможностей.

Расширения могут добавлять новые функции к типу, но не может переопределить существующие функциональные возможности.

Swift расширение может:

  • Добавить вычислительные свойства и расчетные статические свойства
  • Примеры методов и типы, определенные методы
  • Новый конструктор
  • Стандартное определение
  • Определение и использование новых вложенных типов
  • Сделать существующую строку с типом протокола

грамматика

декларации расширения используютрасширение ключевых слов:

extension SomeType {
    // 加到SomeType的新功能写到这里
}

Расширение может расширить существующий тип, он может быть адаптирован к одному или нескольким протоколам, синтаксис выглядит следующим образом:

extension SomeType: SomeProtocol, AnotherProctocol {
    // 协议实现写到这里
}

Вычислительные свойства

Расширения могут добавить вычисляемый пример вида собственности и вычислительных свойств существующих типов.

примеров

Следующий пример добавляет пять свойств на примере расчета типа Int и расширить ее функциональные возможности:

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

let calc = mult()
print ("mult 模块内 \(calc.a.num1, calc.a.num2)")
print("mult 模块内 \(calc.b.no1, calc.b.no2)")

let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))

print("mult 模块内 \(memcalc.a.num1, memcalc.a.num2)")
print("mult 模块内 \(memcalc.b.no1, memcalc.b.no2)")

extension mult {
    init(x: sum, y: diff) {
        _ = x.num1 + x.num2
        _ = y.no1 + y.no2
    }
}


let a = sum(num1: 100, num2: 200)
print("Sum 模块内:\( a.num1, a.num2)")


let b = diff(no1: 200, no2: 100)
print("Diff 模块内: \(b.no1, b.no2)")

Выход выше выполнение программы:

mult 模块内 (100, 200)
mult 模块内 (200, 100)
mult 模块内 (300, 500)
mult 模块内 (300, 100)
Sum 模块内:(100, 200)
Diff 模块内: (200, 100)

способ

Расширения могут добавлять новые методы и методы типа экземпляра для существующих типов.

Следующий пример добавляет новый метод экземпляра под названием темы для типа Int:

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

4.topics({
   print("扩展模块内")       
})    
    
3.topics({
   print("内型转换模块内")       
})  

Выход выше выполнение программы:

扩展模块内
扩展模块内
扩展模块内
扩展模块内
内型转换模块内
内型转换模块内
内型转换模块内

topics метод использует () -> () один параметр типа, указывающий , что функция не имеет параметров и возвращаемого значения.

После определения расширения, вы можете вызвать для любого целого topics методов для достижения функции должна выполнить задачу неоднократно:


Переменный метод экземпляра

Примеры методов путем добавления расширений можно также изменить сам экземпляр.

Структура и перечисляемые типы изменения самостоятельно или имущественные методы должны быть помечены как метод экземпляра мутировать, просто изменить первоначальную реализацию метода из того же самого.

примеров

Следующий пример добавляет новый метод модификации под названием под прямым углом к ​​двойной типа Свифта добиться вычисления квадратного первоначального значения:

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 целое индекс типа. Индекс [п] Возвращает десятичное число

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