Latest web development tutorials

acordo Swift

Acordo para implementar os métodos e propriedades necessários para uma determinada função.

Capaz de satisfazer as exigências de qualquer tipo de acordo é conhecido como acompanhamento (em conformidade) o acordo.

Classe, estrutura ou enumeração tipos podem seguir os protocolos e fornece implementação específica para completar os métodos e funções definidas pelo protocolo.

gramática

Sintaxe acordo são os seguintes:

protocol SomeProtocol {
    // 协议内容
}

Para seguir uma classe de protocolo, você precisa digitar o nome com o nome do protocolo, cólon média: separado, como parte da definição do tipo. Quando vários protocolos a seguir, com uma vírgula entre cada protocolo separado.

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

Se a classe tem de seguir o protocolo, enquanto pai, o nome da classe pai deve ser colocado antes do nome do protocolo, separados por vírgulas.

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

Prestação de propriedade

Protocolo é usado para especificar uma instância específica do atributo de classe ou propriedade, sem especificar o tipo de memória atributo ou propriedade computacional. Também deve ser indicado como somente leitura ou leitura-gravação.

Acordo é, geralmente, para declarar variáveis ​​var declaração de tipo de atributo após a adição {set get} para representar a propriedade é legível e gravável, o atributo só de leitura é representado por {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)

A saída de execução de programa acima é:

98
true
false
Swift 协议
Swift

Métodos de disposições mutação

Às vezes você precisa alterá-la em um método de instância.

Por exemplo, o método de tipo de valor (struct, enum) instância, a palavra-chave mutação em função prefixo, escrito antes func, que mostra um exemplo modificado do valor de suas instâncias pode atribuir ele pertence no processo.

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

A saída de execução de programa acima é:

Wednesday

As disposições do construtor

Acordo pode exigir-lhe a seguir aqueles que implementam o construtor especificado.

Você pode escrever como um construtor comum, como construtores escreveu uma declaração na definição do acordo, mas não escrever chaves e sintaxe de entidade construtores é a seguinte:

protocol SomeProtocol {
   init(someParameter: Int)
}

Exemplos

protocol tcpprotocol {
   init(aprot: Int)
}

Protocolo especificado na implementação construtor da classe

Você pode seguir o construtor acordo em sala de aula, e especificar se é conveniente para especificar o construtor construtor ou classe. Em ambos os casos, você tem que ser para alcançar o sobrescrito construtor "necessária" modificador:

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

protocol tcpprotocol {
   init(aprot: Int)
}

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

Use garantias modificadoras necessários: siga todas as subclasses do contrato, ele também pode fornecer uma implementação explícita ou herdar o construtor para cumprir.

Se uma subclasse substitui o construtor da classe pai especificada, eo construtor segue as disposições de um acordo, então a implementação construtor precisa ser marcada modificadores simultaneamente necessários e substituir:

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

A saída de execução de programa acima é:

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

tipo de protocolo

Embora o próprio acordo não executa qualquer função, mas pode ser utilizado como o tipo de protocolo a utilizar.

À semelhança de outros protocolos podem usar o mesmo tipo geral, cenários de uso:

  • Como uma função, método ou tipos de parâmetro construtor ou o retorno tipo de valor
  • Como um tipo de constantes, variáveis ​​ou propriedades
  • Como uma matriz, um dicionário ou outro tipo de elemento contentor

Exemplos

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

A saída de execução de programa acima é:

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

Adicionando membros no acordo de extensão

Podemos estender para expandir os tipos (classes, estruturas, enumerações, etc.) já existe.

As extensões podem adicionar propriedades membros, métodos e indexar o script, conforme o tipo de protocolo que já existe.

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

acordo herança

Protocolo pode herdar um ou mais outros protocolos, você pode adicionar novos conteúdos exige acordo sobre a base da herança.

A sintaxe é semelhante à herança e protocolo de herança de classe, separados por uma vírgula entre Acordo hereditária múltipla:

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

Exemplos

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)

A saída de execução de programa acima é:

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

Acordo exclusivo

Você pode herdar uma lista de protocolo, adicionando os acordos de restrição classe palavra-chave só pode se enquadrem na categoria (classe) tipo.

A classe deve ser a primeira palavra-chave aparece na lista de protocolos em sucessão, então, é o outro acordo sucessor. Formato é o seguinte:

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

Exemplos

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

A saída de execução de programa acima é:

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

Protocolo de síntese

síntese apoio Swift múltiplos protocolos, o que é muito útil quando precisamos seguir mais de um protocolo.

Sintaxe é como se segue:

protocol<SomeProtocol, AnotherProtocol>

Exemplos

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)

A saída de execução de programa acima é:

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

Acordo de Inspeção consistência

Você pode usar o IS e como operadores para verificar a conformidade com um protocolo ou forçada a um certo tipo.

  • is operador verificar se uma instância 遵循 um determinado 协议 .
  • as? retorna um valor opcional, quando a instância é 遵循 quando o acordo para retornar o tipo de protocolo, caso contrário ele retorna nil .
  • as para abatido obrigatório, falhará se o forte sua vez, irá causar um erro de execução.

Exemplos

O exemplo a seguir define um protocolo HasArea requer um tipo Duplo área legível:

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("没有面积")
    }
}

A saída de execução de programa acima é:

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