Latest web development tutorials

Swift соглашение

Соглашение реализовать методы и свойства, необходимые для той или иной функции.

Способный удовлетворить требования любого типа соглашения известна следующим образом (соответствует) соглашения.

Класс, структура или перечисление типов могут выполнять протоколы и обеспечивает конкретную реализацию, чтобы завершить определение протокола методов и функций.

грамматика

Синтаксис соглашения заключаются в следующем:

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

Наследование соглашение

Протокол может наследовать один или несколько других протоколов, то Вы можете добавить новое содержание требует согласования на основе наследования.

Синтаксис похож на наследование и протокол наследования классов, разделенных запятой между несколькими унаследованной соглашения:

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
没有面积