Лучшее руководство по Swift соглашение в 2024 году. В этом руководстве вы можете изучить Предоставление имущества,Методы положений мутирует,Положения конструктора,Протокол, указанный в реализации конструктора класса,Тип протокола,Добавление членов в договоре расширения,Наследование соглашение,Эксклюзивное соглашение,Протокол Синтез,Ознакомительная Соглашение Консистенция,
Соглашение реализовать методы и свойства, необходимые для той или иной функции.
Способный удовлетворить требования любого типа соглашения известна следующим образом (соответствует) соглашения.
Класс, структура или перечисление типов могут выполнять протоколы и обеспечивает конкретную реализацию, чтобы завершить определение протокола методов и функций.
Синтаксис соглашения заключаются в следующем:
protocol SomeProtocol { // 协议内容 }
Чтобы следовать класс протокола, вам необходимо ввести имя с именем протокола, средней кишки: ступенчато, как часть определения типа. Когда несколько протоколов, чтобы следовать, с запятой между каждым протоколом разделены.
struct SomeStructure: FirstProtocol, AnotherProtocol { // 结构体内容 }
Если класс должен следовать протоколу, но при родителя, имя класса родитель должен быть помещен перед именем протокола, разделенных запятыми.
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { // 类的内容 }
Протокол используется для указания конкретного экземпляра атрибута класса или собственности, без указания атрибута памяти типа или вычислительной свойства. Оно также должно быть указано, как только для чтения или для чтения и записи.
Договор, как правило, объявлять переменные VAR декларации типа атрибута после добавления {SET} 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)
Выход выше выполнение программы:
98 true false Swift 协议 Swift
Иногда вам нужно изменить его в метод экземпляра.
Например, тип значения (структура, перечисление) метод экземпляра, то ключевое слово мутирует как функции префикса, написанные до FUNC, показывающий модифицированный пример значения его экземпляров может приписать это принадлежит в этом процессе.
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()
Выход выше выполнение программы:
Wednesday
Соглашение может потребовать от него следовать за теми, кто реализует указанный конструктор.
Вы можете написать как обычный конструктор, поскольку конструкторы написали заявление в определении в договоре, но не писать фигурные скобки и синтаксис конструктора сущность выглядит следующим образом:
protocol SomeProtocol { init(someParameter: Int) }
protocol tcpprotocol { init(aprot: Int) }
Вы можете следить за конструктор соглашения в классе, а также указать, является ли это удобно задавать конструктор конструктора или класса. В обоих случаях, вы должны быть для достижения конструктора верхнего индекса "требуется" модификатор:
class SomeClass: SomeProtocol { required init(someParameter: Int) { // 构造器实现 } } protocol tcpprotocol { init(aprot: Int) } class tcpClass: tcpprotocol { required init(aprot: Int) { } }
Использование модификаторов гарантий, требуемых: соблюдать все подклассы соглашения, он также может обеспечить явной реализации или наследовать конструктор для выполнения.
Если подкласс переопределяет заданный конструктор родительского класса, а конструктор придерживается положений соглашения, то реализация конструктор должен быть отмечен одновременно необходимые и переопределить модификаторы:
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)")
Выход выше выполнение программы:
res is: 20 res is: 30 res is: 50
Несмотря на то, само соглашение не выполняет никакой функции, но может быть использован в качестве типа используемого протокола.
Как и другие протоколы могут использовать один и тот же общий тип, сценарии использования:
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}))
Выход выше выполнение программы:
10 20 30 5 10 15 [100, 200, 300] [10, 20, 30]
Мы можем расширить, чтобы расширить типы (классы, структуры, перечислений и т.д.) уже существует.
Расширения могут добавлять свойства элементов, методы и индекс сценарий, как тип протокола, который уже существует.
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 0ru.2: return "Baby" case 2ru.12: return "Child" case 13ru.19: return "Teenager" case let x where x > 65: return "Elderly" default: return "Normal" } } }
Протокол может наследовать один или несколько других протоколов, то Вы можете добавить новое содержание требует согласования на основе наследования.
Синтаксис похож на наследование и протокол наследования классов, разделенных запятой между несколькими унаследованной соглашения:protocol InheritingProtocol: SomeProtocol, AnotherProtocol { // 协议定义 }
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)
Выход выше выполнение программы:
学生尝试 1 次通过 学生尝试 1 次通过 学生尝试 1 次通过 学生尝试 5 次通过 学生尝试 5 次通过 学生缺席考试 学生尝试 5 次通过 学生缺席考试
Вы можете наследовать список протокола, путем добавления ключевых слов соглашения удерживающих класса может поместиться только в категории (класса) типа.
Класс должен быть первое ключевое слово появляется в списке протоколов в последовательности, то есть другое соглашение преемником. Формат выглядит следующим образом:
protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol { // 协议定义 }
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)")
Выход выше выполнение программы:
res is: 20 res is: 30 res is: 50
Swift поддержки синтеза несколько протоколов, что очень полезно, когда мы должны следовать более одного протокола.
Синтаксис выглядит следующим образом:
protocol<SomeProtocol, AnotherProtocol>
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)
Выход выше выполнение программы:
Person(name: "Priya", age: 21) Person(name: "Rehan", age: 29) Person(name: "Roshan", age: 19)
Вы можете использовать есть и как операторы, чтобы проверить соответствие с протоколом или принудительным определенного типа.
is
оператор , чтобы проверить , является ли экземпляр 遵循
определенный 协议
. as?
, 遵循
nil
as?
возвращает необязательное значение, когда экземпляр 遵循
, когда соглашение возвращать тип протокола, в противном случае она возвращает nil
. as
обязательного опущенными, терпит неудачу , если сильный ход, приведет к ошибке во время выполнения. В следующем примере определяется протоколом HasArea требует читаемый область Двойной тип:
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("没有面积") } }
Выход выше выполнение программы:
面积为 12.5663708 面积为 243610.0 没有面积