Latest web development tutorials

ekspansi Swift

Hal ini untuk memperpanjang kelas, struct, atau jenis pencacahan yang ada untuk menambahkan fitur baru.

Ekstensi dapat menambahkan fitur baru untuk jenis, tapi tidak bisa menimpa fungsi yang ada.

Swift ekspansi dapat:

  • Tambahkan sifat komputasi dan sifat statis komputasi
  • metode contoh metode dan jenis didefinisikan
  • konstruktor baru
  • definisi standar
  • Definisi dan penggunaan jenis bersarang baru
  • Membuat garis yang ada dengan jenis protokol

tatabahasa

deklarasi ekstensi menggunakanekstensi kata kunci:

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

Perpanjangan dapat memperpanjang jenis yang ada, dapat disesuaikan dengan satu atau lebih protokol, sintaks adalah sebagai berikut:

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

sifat komputasi

Ekstensi dapat menambahkan contoh dihitung dari jenis properti dan properti komputasi untuk jenis yang ada.

contoh

Contoh berikut menambahkan lima properti untuk contoh perhitungan jenis Int dan memperluas fungsi:

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

Output di atas eksekusi program adalah:

加法运算后的值:103
减法运算后的值:110
乘法运算后的值:390
除法运算后的值: 11
混合运算结果:154

pembina

Ekstensi dapat menambahkan konstruktor baru untuk jenis yang ada.

Hal ini memungkinkan Anda untuk memperpanjang jenis lainnya, jenis kustom Anda sendiri sebagai argumen konstruktor, atau jenis pilihan inisialisasi tambahan yang tidak termasuk dalam pelaksanaan asli yang disediakan.

Ekstensi dapat menambahkan konstruktor kenyamanan baru ke init kelas (), tetapi mereka tidak dapat menambahkan baru ditunjuk constructor atau destructor deinit ke kelas ().

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

Output di atas eksekusi program adalah:

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

cara

Ekstensi dapat menambahkan metode baru dan metode contoh jenis untuk jenis yang ada.

Contoh berikut menambahkan metode contoh baru bernama topik tipe Int:

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

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

Output di atas eksekusi program adalah:

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

The topics Metode menggunakan () -> () tunggal jenis parameter, menunjukkan bahwa fungsi tidak memiliki parameter dan tidak ada nilai kembali.

Setelah mendefinisikan ekstensi, Anda dapat menghubungi untuk setiap bilangan bulat topics metode untuk mencapai fungsi ini untuk melakukan tugas berulang kali:


metode contoh variabel

Contoh metode dengan menambahkan ekstensi juga dapat memodifikasi contoh itu sendiri.

Struktur dan disebutkan jenis memodifikasi diri atau properti metode harus ditandai sebagai metode contoh dari bermutasi, hanya memodifikasi pelaksanaan asli dari metode dari yang sama.

contoh

Contoh berikut menambahkan metode modifikasi baru yang disebut persegi untuk Swift tipe dua kali untuk mencapai perhitungan nilai asli persegi:

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

Output di atas eksekusi program adalah:

圆的面积为: 34.210935
圆的面积为: 105.68006
圆的面积为: 45464.070735

tanda tangan

Ekstensi dapat menambah indeks baru untuk tipe yang ada.

contoh

Berikut contoh untuk Swift menambahkan jenis indeks Int bulat built-in. indeks [n] Mengembalikan angka desimal

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

Output di atas eksekusi program adalah:

2
6
5

jenis bersarang

Anda dapat memperluas kelas yang ada, struktur, dan mantri menambahkan jenis bersarang baru:

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

Output di atas eksekusi program adalah:

 10 
 20 
 30 
 40 
 50 
 50