Latest web development tutorials

perjanjian Swift

Kesepakatan untuk menerapkan metode dan properti yang diperlukan untuk fungsi tertentu.

Mampu memenuhi persyaratan dari setiap jenis perjanjian yang dikenal sebagai berikut (sesuai) perjanjian.

Kelas, struktur, atau pencacahan jenis dapat mengikuti protokol dan menyediakan implementasi khusus untuk menyelesaikan metode protokol didefinisikan dan fungsi.

tatabahasa

Perjanjian sintaks adalah sebagai berikut:

protocol SomeProtocol {
    // 协议内容
}

Untuk mengikuti kelas protokol, Anda harus mengetikkan nama dengan nama protokol, usus tengah: dipisahkan, sebagai bagian dari definisi jenis. Ketika beberapa protokol untuk mengikuti, dengan koma di antara setiap protokol dipisahkan.

struct SomeStructure: FirstProtocol, AnotherProtocol {
    // 结构体内容
}

Jika kelas harus mengikuti protokol sementara orang tua, orang tua nama kelas harus ditempatkan sebelum nama protokol, dipisahkan dengan koma.

class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 类的内容
}

Penyediaan properti

Protocol digunakan untuk menentukan contoh khusus dari atribut kelas atau properti, tanpa menentukan memori jenis atribut atau properti komputasi. Hal ini juga harus ditunjukkan sebagai read-only atau read-write.

Perjanjian biasanya untuk mendeklarasikan variabel var jenis atribut deklarasi setelah menambahkan {set get} untuk mewakili properti dibaca dan ditulis, atribut read-only diwakili oleh {mendapatkan}.

protocol classa {
    
    var marks: Int { get set }
    var result: Bool { get }
    
    func attendance() -> String
    func markssecured() -> String
    
}

protocol classb: classa {
    
    var present: Bool { get set }
    var subject: String { get set }
    var stname: String { get set }
    
}

class classc: classb {
    var marks = 96
    let result = true
    var present = false
    var subject = "Swift 协议"
    var stname = "Protocols"
    
    func attendance() -> String {
        return "The \(stname) has secured 99% attendance"
    }
    
    func markssecured() -> String {
        return "\(stname) has scored \(marks)"
    }
}

let studdet = classc()
studdet.stname = "Swift"
studdet.marks = 98
studdet.markssecured()

print(studdet.marks)
print(studdet.result)
print(studdet.present)
print(studdet.subject)
print(studdet.stname)

Output di atas eksekusi program adalah:

98
true
false
Swift 协议
Swift

Metode ketentuan bermutasi

Kadang-kadang Anda perlu mengubahnya dalam metode contoh.

Misalnya, jenis nilai (struct, enum) metode contoh, kata kunci bermutasi sebagai fungsi awalan, ditulis sebelum func, menunjukkan contoh modifikasi dari nilai contoh yang dapat atribut itu termasuk dalam proses.

protocol daysofaweek {
    mutating func show()
}

enum days: daysofaweek {
    case sun, mon, tue, wed, thurs, fri, sat
    mutating func show() {
        switch self {
        case sun:
            self = sun
            print("Sunday")
        case mon:
            self = mon
            print("Monday")
        case tue:
            self = tue
            print("Tuesday")
        case wed:
            self = wed
            print("Wednesday")
        case mon:
            self = thurs
            print("Thursday")
        case tue:
            self = fri
            print("Friday")
        case sat:
            self = sat
            print("Saturday")
        default:
            print("NO Such Day")
        }
    }
}

var res = days.wed
res.show()

Output di atas eksekusi program adalah:

Wednesday

Ketentuan konstruktor

Perjanjian mungkin memerlukan untuk mengikuti orang-orang yang melaksanakan konstruktor ditentukan.

Anda dapat menulis seperti konstruktor biasa, sebagai konstruktor menulis sebuah pernyataan dalam definisi dalam perjanjian, tetapi tidak menulis kawat gigi dan konstruktor entitas sintaks adalah sebagai berikut:

protocol SomeProtocol {
   init(someParameter: Int)
}

contoh

protocol tcpprotocol {
   init(aprot: Int)
}

Protokol yang ditentukan dalam pelaksanaan kelas konstruktor

Anda dapat mengikuti konstruktor kesepakatan di kelas, dan menentukan apakah akan lebih mudah untuk menentukan konstruktor atau kelas konstruktor. Dalam kedua kasus, Anda harus mencapai superscript konstruktor "diperlukan" pengubah:

class SomeClass: SomeProtocol {
   required init(someParameter: Int) {
      // 构造器实现
   }
}

protocol tcpprotocol {
   init(aprot: Int)
}

class tcpClass: tcpprotocol {
   required init(aprot: Int) {
   }
}

Gunakan jaminan pengubah diperlukan: ikuti semua subclass dari perjanjian tersebut, juga dapat memberikan implementasi eksplisit atau mewarisi konstruktor untuk memenuhi.

Jika subclass menimpa konstruktor kelas induk yang ditentukan, dan konstruktor mengikuti ketentuan perjanjian, maka pelaksanaan konstruktor perlu ditandai secara bersamaan diperlukan dan menimpa pengubah:

protocol tcpprotocol {
    init(no1: Int)
}

class mainClass {
    var no1: Int // 局部变量
    init(no1: Int) {
        self.no1 = no1 // 初始化
    }
}

class subClass: mainClass, tcpprotocol {
    var no2: Int
    init(no1: Int, no2 : Int) {
        self.no2 = no2
        super.init(no1:no1)
    }
    // 因为遵循协议,需要加上"required"; 因为继承自父类,需要加上"override"
    required override convenience init(no1: Int)  {
        self.init(no1:no1, no2:0)
    }
}
let res = mainClass(no1: 20)
let show = subClass(no1: 30, no2: 50)

print("res is: \(res.no1)")
print("res is: \(show.no1)")
print("res is: \(show.no2)")

Output di atas eksekusi program adalah:

res is: 20
res is: 30
res is: 50

jenis protokol

Meskipun perjanjian itu sendiri tidak mengimplementasikan fungsi apapun, tetapi dapat digunakan sebagai jenis protokol untuk digunakan.

Seperti protokol lain mungkin menggunakan jenis umum yang sama, skenario penggunaan:

  • Sebagai fungsi, metode, atau jenis parameter konstruktor atau kembali jenis nilai
  • Sebagai jenis konstanta, variabel, atau properti
  • Sebagai array, kamus atau jenis elemen wadah lainnya

contoh

protocol Generator {
    typealias members
    func next() -> members?
}

var items = [10,20,30].generate()
while let x = items.next() {
    print(x)
}

for lists in [1,2,3].map( {i in i*5}) {
    print(lists)
}

print([100,200,300])
print([1,2,3].map({i in i*10}))

Output di atas eksekusi program adalah:

10
20
30
5
10
15
[100, 200, 300]
[10, 20, 30]

Menambahkan anggota dalam perjanjian perpanjangan

Kita dapat memperpanjang untuk memperluas jenis (kelas, struktur, mantri, dll) sudah ada.

Ekstensi dapat menambah properti anggota, metode, dan indeks script, seperti jenis protokol yang sudah ada.

protocol AgeClasificationProtocol {
   var age: Int { get }
   func agetype() -> String
}

class Person {
   let firstname: String
   let lastname: String
   var age: Int
   init(firstname: String, lastname: String) {
      self.firstname = firstname
      self.lastname = lastname
      self.age = 10
   }
}

extension Person : AgeClasificationProtocol {
   func fullname() -> String {
      var c: String
      c = firstname + " " + lastname
      return c
   }
   
   func agetype() -> String {
      switch age {
      case 0...2:
         return "Baby"
      case 2...12:
         return "Child"
      case 13...19:
         return "Teenager"
      case let x where x > 65:
         return "Elderly"
      default:
         return "Normal"
      }
   }
}

perjanjian warisan

Protokol dapat mewarisi satu atau lebih protokol lain, Anda dapat menambahkan konten baru membutuhkan kesepakatan atas dasar warisan.

sintaks mirip dengan warisan dan protokol warisan kelas, dipisahkan oleh koma di antara beberapa Perjanjian diwariskan:

protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
    // 协议定义
}

contoh

protocol Classa {
    var no1: Int { get set }
    func calc(sum: Int)
}

protocol Result {
    func print(target: Classa)
}

class Student2: Result {
    func print(target: Classa) {
        target.calc(1)
    }
}

class Classb: Result {
    func print(target: Classa) {
        target.calc(5)
    }
}

class Student: Classa {
    var no1: Int = 10
    
    func calc(sum: Int) {
        no1 -= sum
        print("学生尝试 \(sum) 次通过")
        
        if no1 <= 0 {
            print("学生缺席考试")
        }
    }
}

class Player {
    var stmark: Result!
    
    init(stmark: Result) {
        self.stmark = stmark
    }
    
    func print(target: Classa) {
        stmark.print(target)
    }
}

var marks = Player(stmark: Student2())
var marksec = Student()

marks.print(marksec)
marks.print(marksec)
marks.print(marksec)
marks.stmark = Classb()
marks.print(marksec)
marks.print(marksec)
marks.print(marksec)

Output di atas eksekusi program adalah:

学生尝试 1 次通过
学生尝试 1 次通过
学生尝试 1 次通过
学生尝试 5 次通过
学生尝试 5 次通过
学生缺席考试
学生尝试 5 次通过
学生缺席考试

Perjanjian eksklusif

Anda dapat mewarisi daftar protokol, dengan menambahkan perjanjian menahan diri kata kunci class hanya bisa masuk ke dalam kategori (kelas) jenis.

kelas harus menjadi kata kunci pertama muncul dalam daftar protokol berturut-turut, maka, adalah perjanjian pengganti lainnya. Format adalah sebagai berikut:

protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {
    // 协议定义
}

contoh

protocol TcpProtocol {
    init(no1: Int)
}

class MainClass {
    var no1: Int // 局部变量
    init(no1: Int) {
        self.no1 = no1 // 初始化
    }
}

class SubClass: MainClass, TcpProtocol {
    var no2: Int
    init(no1: Int, no2 : Int) {
        self.no2 = no2
        super.init(no1:no1)
    }
    // 因为遵循协议,需要加上"required"; 因为继承自父类,需要加上"override"
    required override convenience init(no1: Int)  {
        self.init(no1:no1, no2:0)
    }
}

let res = MainClass(no1: 20)
let show = SubClass(no1: 30, no2: 50)

print("res is: \(res.no1)")
print("res is: \(show.no1)")
print("res is: \(show.no2)")

Output di atas eksekusi program adalah:

res is: 20
res is: 30
res is: 50

sintesis Protocol

Swift dukungan sintesis beberapa protokol, yang sangat berguna ketika kita harus mengikuti lebih dari satu protokol.

Sintaks adalah sebagai berikut:

protocol<SomeProtocol, AnotherProtocol>

contoh

protocol Stname {
    var name: String { get }
}

protocol Stage {
    var age: Int { get }
}

struct Person: Stname, Stage {
    var name: String
    var age: Int
}

func show(celebrator: protocol<Stname, Stage>) {
    print("\(celebrator.name) is \(celebrator.age) years old")
}

let studname = Person(name: "Priya", age: 21)
print(studname)

let stud = Person(name: "Rehan", age: 29)
print(stud)

let student = Person(name: "Roshan", age: 19)
print(student)

Output di atas eksekusi program adalah:

Person(name: "Priya", age: 21)
Person(name: "Rehan", age: 29)
Person(name: "Roshan", age: 19)

Perjanjian Pemeriksaan konsistensi

Anda dapat menggunakan yaitu dan sebagai operator untuk memeriksa kepatuhan dengan protokol atau dipaksa jenis tertentu.

  • is operator untuk memeriksa apakah sebuah contoh 遵循 tertentu 协议 .
  • as? mengembalikan nilai opsional, ketika misalnya yang 遵循 saat perjanjian untuk mengembalikan jenis protokol, jika tidak maka kembali nil .
  • as untuk tertunduk wajib, gagal jika gilirannya kuat, akan menyebabkan kesalahan runtime.

contoh

Contoh berikut mendefinisikan protokol HasArea membutuhkan dua jenis daerah dibaca:

protocol HasArea {
    var area: Double { get }
}

// 定义了Circle类,都遵循了HasArea协议
class Circle: HasArea {
    let pi = 3.1415927
    var radius: Double
    var area: Double { return pi * radius * radius }
    init(radius: Double) { self.radius = radius }
}

// 定义了Country类,都遵循了HasArea协议
class Country: HasArea {
    var area: Double
    init(area: Double) { self.area = area }
}

// Animal是一个没有实现HasArea协议的类
class Animal {
    var legs: Int
    init(legs: Int) { self.legs = legs }
}

let objects: [AnyObject] = [
    Circle(radius: 2.0),
    Country(area: 243_610),
    Animal(legs: 4)
]

for object in objects {
    // 对迭代出的每一个元素进行检查,看它是否遵循了HasArea协议
    if let objectWithArea = object as? HasArea {
        print("面积为 \(objectWithArea.area)")
    } else {
        print("没有面积")
    }
}

Output di atas eksekusi program adalah:

面积为 12.5663708
面积为 243610.0
没有面积