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}
}
出来ますか?
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 {}
}
}
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
}
}