porozumienia SWIFT
Umowa na wdrożenie metod i właściwości wymaganych dla danej funkcji.
W stanie spełnić wymagania każdego rodzaju umowy znana jest następująca (zgodne) umowy.
Klasa, struktura lub wyliczenie rodzajów może obserwować protokoły i zapewnia realizację konkretnego celu zakończenia metod i protokołów funkcje zdefiniowane.
gramatyka
Umowa Składnia przedstawiają się następująco:
protocol SomeProtocol { // 协议内容 }
Aby śledzić klasy protokołu, należy wpisać nazwę z nazwą protokołu, Bliski jelita grubego: w separacji, jako część definicji typu. Gdy wiele protokołów do naśladowania, przecinkiem pomiędzy każdym protokole rozdzielone.
struct SomeStructure: FirstProtocol, AnotherProtocol { // 结构体内容 }
Jeśli klasa ma podążać protokół while rodzica, nazwa klasy rodzic powinien być umieszczony przed nazwą protokołu, rozdzielając je przecinkami.
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { // 类的内容 }
Zapewnienie własności
Protokół jest używany do określenia konkretnej instancji atrybutu klasy lub mienia, bez określania atrybutu pamięci typu lub mienia obliczeniowej. To musi być również wskazany jako tylko do odczytu lub odczytu i zapisu.
Umowa jest zazwyczaj zadeklarować zmienne var deklarację typu atrybutu po dodaniu {Ustaw get} reprezentuje właściwość jest do odczytu i zapisu, atrybut tylko do odczytu jest reprezentowany przez {get}.
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)
Wyjście powyżej wykonywanie programu jest:
98 true false Swift 协议 Swift
Metody przepisów mutowania
Czasami trzeba zmienić go w metodzie instancji.
Na przykład, wartość typu (Struct wyliczeniowym) Metoda przykład, mutacji kluczowe w funkcji prefiksu napisany przed func, pokazano zmodyfikowany przykład wartości jego przypadkach może przypisać należy w tym procesie.
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()
Wyjście powyżej wykonywanie programu jest:
Wednesday
Przepisy konstruktora
Umowa może wymagać go do naśladowania tych, którzy realizować określony konstruktor.
Można pisać jak zwykły konstruktora, ponieważ konstruktorzy napisał oświadczenie w definicji w umowie, ale nie pisz szelki i składnia podmiot konstruktorzy przedstawia się następująco:
protocol SomeProtocol { init(someParameter: Int) }
Przykłady
protocol tcpprotocol { init(aprot: Int) }
Protokół określony w realizacji konstruktora klasy
Możesz śledzić konstruktora umowy w klasie, i określić, czy jest to wygodne, aby określić konstruktor konstruktora lub klasy. W obu przypadkach trzeba być osiągnięcie odnośnikiem konstruktora "niezbędne" modyfikator:
class SomeClass: SomeProtocol { required init(someParameter: Int) { // 构造器实现 } } protocol tcpprotocol { init(aprot: Int) } class tcpClass: tcpprotocol { required init(aprot: Int) { } }
Użyj gwarancji wymaganych modyfikatorów: przestrzegać wszystkich podklas umowy, może też stanowić wyraźny wdrożenia lub odziedziczyć konstruktora do spełnienia.
Jeśli podklasą zastępuje określony konstruktora klasy nadrzędnej, a konstruktor przestrzega postanowień umowy, a następnie wdrożenie konstruktor musi być oznaczony jednocześnie niezbędne i zastąpić modyfikatory:
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)")
Wyjście powyżej wykonywanie programu jest:
res is: 20 res is: 30 res is: 50
Typ protokołu
Chociaż sama umowa nie implementuje żadnej funkcji, ale może być używany jako typ protokół.
Podobnie jak inne protokoły mogą wykorzystywać ten sam typ ogólny, scenariusze użycia:
- Jako funkcji, metody lub typów parametrów konstruktora lub Return typu wartości
- Jako typ stałych, zmiennych lub właściwości
- Jako tablica, słownika lub innego typu elementu kontenera
Przykłady
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}))
Wyjście powyżej wykonywanie programu jest:
10 20 30 5 10 15 [100, 200, 300] [10, 20, 30]
Dodawanie członków w umowie przedłużacza
Możemy rozszerzyć rozszerzyć typów (klas, struktur, wyliczeń, etc.) już istnieje.
Rozszerzenia mogą dodawać właściwości członków, metod i indeks scenariusz, jako typ protokołu, który już istnieje.
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" } } }
Umowa Dziedziczenie
Protokół może dziedziczyć jeden lub więcej innych protokołów, można dodać nowe treści wymaga umowy na podstawie dziedziczenia.
Składnia jest podobna do dziedziczenia oraz protokół klasy dziedziczenie, oddzielonych przecinkami między wieloma odziedziczonej Umowy:protocol InheritingProtocol: SomeProtocol, AnotherProtocol { // 协议定义 }
Przykłady
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)
Wyjście powyżej wykonywanie programu jest:
学生尝试 1 次通过 学生尝试 1 次通过 学生尝试 1 次通过 学生尝试 5 次通过 学生尝试 5 次通过 学生缺席考试 学生尝试 5 次通过 学生缺席考试
Umowa Exclusive
Można dziedziczyć listę protokołu, dodając słowo kluczowe class układów przytrzymujących może pasować tylko do kategorii (klasy) typ.
Klasa musi być pierwsze słowo kluczowe pojawi się na liście protokołów z rzędu, to jest druga umowa następcą. Format jest następujący:
protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol { // 协议定义 }
Przykłady
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)")
Wyjście powyżej wykonywanie programu jest:
res is: 20 res is: 30 res is: 50
Synteza protokół
Swift wspomagająca syntezę wielu protokołów, co jest bardzo przydatne, gdy musimy śledzić więcej niż jeden protokół.
Składnia jest następująca:
protocol<SomeProtocol, AnotherProtocol>
Przykłady
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)
Wyjście powyżej wykonywanie programu jest:
Person(name: "Priya", age: 21) Person(name: "Rehan", age: 29) Person(name: "Roshan", age: 19)
Umowa Spójność Inspection
Można korzystać z IS i operatorzy w celu sprawdzenia zgodności z protokołem lub zmuszeni do określonego typu.
-
is
operatorem w celu sprawdzenia, czy instancja遵循
pewien协议
. -
as?
zwraca opcjonalną wartość, gdy instancja jest遵循
, gdy umowa wrócić typ protokołu; w przeciwnym wypadku zwracanil
. -
as
obowiązkowego spuszczonymi, nie powiedzie się, jeśli silny kolej, spowoduje błąd wykonania.
Przykłady
Poniższy przykład definiuje protokół HasArea wymaga obszar czytelnego typu double:
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("没有面积") } }
Wyjście powyżej wykonywanie programu jest:
面积为 12.5663708 面积为 243610.0 没有面积