Расширения в Swift
Расширения добавляют новую функциональность существующему классу, структуре или типу перечисления.
Расширения могут добавлять новую функциональность типу, но не могут переопределять существующую функциональность.
Расширения в Swift могут:
- Добавить вычисляемые свойства и вычисляемые статические свойства
- Определить методы экземпляра и методы типа
- Предоставить новые инициализаторы
- Определить сабскрипты
- Определить и использовать новые вложенные типы
- Сделать существующий тип соответствующим протоколу
Синтаксис
Объявления расширений используют ключевое словоextension:
extension SomeType {
// 加到SomeType的新功能写到这里
}
Расширение может расширить существующий тип, чтобы сделать его соответствующим одному или нескольким протоколам, синтаксис имеет следующий вид:
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里
}
Вычисляемые свойства
Расширения могут добавлять вычисляемые свойства экземпляра и вычисляемые свойства типа к существующим типам.
Пример
Следующий пример добавляет 5 вычисляемых свойств экземпляра к типу 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()
}
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("内型转换模块内")
})
Вывод выполнения вышеуказанной программы:
Within the extension module
Этотtopicsметод использует() -> ()единственный параметр типа, указывающий, что функция не имеет параметров и не возвращает значение.
После определения этого расширения вы можете вызвать его у любого целого числаtopicsэтот метод, который реализует функциональность выполнения задачи несколько раз:
Мутирующие методы экземпляра
Методы экземпляра, добавленные через расширения, также могут изменять сам экземпляр.
В структурах и перечислениях методы, изменяющие self или его свойства, должны помечать метод экземпляра как mutating, точно так же, как это делают изменяющие методы из исходной реализации.
Пример
В следующем примере к типу Double в Swift добавляется новый мутирующий метод с именем 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
Индексы
Расширения могут добавлять новые индексы к существующему типу.
Пример
В следующем примере к встроенному типу Int в Swift добавляется целочисленный индекс. Индекс [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Другие расширения