web-dev-qa-db-fra.com

Des variables optionnelles dans le protocole sont-elles possibles?

protocol AProtocol: BProtocol {
    /// content to be shown on disclaimer Label of cell
    var disclaimer: String {get set}
    var cellDisclaimerAttributed: NSAttributedString {get}
    var showSelection: Bool {get set}
    var isReadMore: Bool {get}
}

Je veux rendre les variables facultatives afin de ne pas avoir à implémenter toutes les variables à chaque fois après la conformité du protocole. Comme dans Objective-C, nous l'avons fait pour les méthodes:

protocol AProtocol: BProtocol {
    /// content to be shown on disclaimer Label of cell
    optional var disclaimer: String {get set}
    optional var cellDisclaimerAttributed: NSAttributedString {get}
    optional var showSelection: Bool {get set}
    optional var isReadMore: Bool {get}
}

C'est possible?

18
Renuka Pandey
protocol TestProtocol {
    var name : String {set get}
    var age : Int {set get}
}

Fournissez une extension par défaut pour le protocole. Fournissez l'implémentation par défaut pour toutes les variables définies et obtenez celles que vous souhaitez qu'elles soient facultatives.

Dans le protocole ci-dessous, le nom et l'âge sont facultatifs.

 extension TestProtocol {

    var name: String {
        get { return "Any default Name" } set {}
    }  
    var age : Int { get{ return 23 } set{} }      
}

Maintenant, si je suis conforme au protocole ci-dessus à toute autre classe, comme

class TestViewController: UIViewController, TestProtocol{
        var itemName: String = ""

**I can implement the name only, and my objective is achieved here, that the controller will not give a warning that "TestViewController does not conform to protocol TestProtocol"**

   var name: String {
        get {
            return itemName ?? ""
        } set {}
    }
}
24
Renuka Pandey

Si vous voulez conforme à la documentation de Swift , vous devez l'implémenter comme ceci:

@objc protocol Named {
    // variables
    var name: String { get }
    @objc optional var age: Int { get }

    // methods
    func addTen(to number: Int) -> Int
    @objc optional func addTwenty(to number: Int) -> Int
}

class Person: Named {
    var name: String

    init(name: String) {
        self.name = name
    }

    func addTen(to number: Int) -> Int {
        return number + 10
    }
}
4
Alexandre G.