Swift - Uzantılar

Mevcut bir sınıfın, yapının veya numaralandırma türünün işlevselliği, uzantılar yardımıyla eklenebilir. Tip işlevselliği uzantılarla eklenebilir ancak işlevselliğin geçersiz kılınması uzantılarla mümkün değildir.

Swift Extension Functionalities -

  • Hesaplanan özellikler ve hesaplanan tür özellikleri ekleme
  • Örnek ve tip yöntemlerini tanımlama.
  • Yeni başlatıcılar sağlamak.
  • Abonelikleri tanımlama
  • Yeni iç içe türler tanımlama ve kullanma
  • Mevcut bir türü bir protokole uygun hale getirmek

Uzantılar, "uzantı" anahtar kelimesiyle bildirilir

Sözdizimi

extension SomeType {
   // new functionality can be added here
}

Mevcut tür, bir protokol standardı olması için uzantılarla da eklenebilir ve sözdizimi, sınıfların veya yapılarınkine benzer.

extension SomeType: SomeProtocol, AnotherProtocol {
   // protocol requirements is described here
}

Hesaplanan Özellikler

Hesaplanan 'örnek' ve 'tür' özellikleri de uzantılar yardımıyla genişletilebilir.

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Addition is 103
Subtraction is 110
Multiplication is 390
Division is 11
Mixed Type is 154

Başlatıcılar

Swift 4, uzantılara göre mevcut bir türe yeni başlatıcılar ekleme esnekliği sağlar. Kullanıcı, önceden tanımlanmış türleri genişletmek için kendi özel türlerini ekleyebilir ve ek başlatma seçenekleri de mümkündür. Uzantılar yalnızca init () 'i destekler. deinit () uzantılar tarafından desteklenmiyor.

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

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)

Yöntemler

Uzantılar yardımıyla alt sınıfa yeni örnek yöntemleri ve tür yöntemleri eklenebilir.

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

4.topics(summation: {
   print("Inside Extensions Block")
})

3.topics(summation: {
   print("Inside Type Casting Block")
})

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Type Casting Block
Inside Type Casting Block
Inside Type Casting Block

konular () işlevi, işlevin herhangi bir bağımsız değişken almadığını ve herhangi bir değer döndürmeyeceğini belirtmek için '(toplama: () → ())' türünde bağımsız değişken alır. Bu işlevi birden çok kez çağırmak için, blok başlatılır ve topic () ile yönteme çağrı başlatılır.

Değişen Örnek Yöntemleri

Örnek yöntemleri, uzantı olarak bildirildiğinde de değiştirilebilir.

Kendini veya özelliklerini değiştiren yapı ve numaralandırma yöntemleri, örnek yöntemini, tıpkı orijinal bir uygulamadaki değiştirme yöntemlerinde olduğu gibi, mutasyon olarak işaretlemelidir.

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Area of circle is: 34.210935
Area of circle is: 105.68006
Area of circle is: 45464.070735

Abonelikler

Halihazırda bildirilmiş örneklere yeni abonelikler eklemek uzantılarla da mümkün olabilir.

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

2
6
5

İç içe Türler

Sınıf, yapı ve numaralandırma örnekleri için iç içe geçmiş türler de uzantıların yardımıyla genişletilebilir.

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

10
20
30
40
50
50