web-dev-qa-db-ja.com

プロトコルのオプション変数は可能ですか?

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

プロトコルを適合させた後、毎回すべての変数を実装する必要がないように、変数をオプションにしたい。Objective-Cのようにメソッドに対して行ったように:

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

出来ますか?

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

プロトコルのデフォルトの拡張子を指定します。すべての変数セットのデフォルト実装を提供し、それらをオプションにしたいものを取得します。

以下のプロトコルでは、名前と年齢はオプションです

 extension TestProtocol {

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

上記のプロトコルを他のクラスに適合させる場合、たとえば

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

Swiftのドキュメントに準拠 にしたい場合は、次のように実装します。

@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.