美文网首页
45.Swift遵循协议返回Self

45.Swift遵循协议返回Self

作者: noonez | 来源:发表于2017-05-24 19:52 被阅读202次

1.假如有协议

import UIKit

//使用SwiftKVCModel的Model类必须遵循的协议
protocol SwiftKVCModelProtocol:NSObjectProtocol {
    /// 必须在没有参数的情况下,这个model能被创建
    ///
    /// - Returns:
    static func createModel()->Self
   
    func clone() -> Self
    /**
     注册model中所需要使用的其它model类的类型,model必须遵循本协议
     
     @return model类列表
     */
    func registerClassList()->[SwiftKVCModelProtocol]
    
    /**
     注册数组属性所需要的的类型,当model中有属性是数组类型时,指定数组的model类型,model必须遵循本协议
     
     @return 属性名和它对应的类型列表
     */
    func arrayProperTypeList()->[String:SwiftKVCModelProtocol]
}

2.类AModel遵循协议

import UIKit

class AModel: NSObject, SwiftKVCModelProtocol {
    var name = ""
    var sex = false
    var age = 0
    
    required override init() {
        super.init()
    }
    
    static func createModel() -> Self {
        return self.init()
    }
   func clone() -> Self {
        return type(of: self).init()
    }
    func registerClassList() -> [SwiftKVCModelProtocol] {
        return []
    }
    func arrayProperTypeList() -> [String : SwiftKVCModelProtocol] {
        return [:]
    }
    
    override var description: String{
        return "name=\(name), sex=\(sex), age=\(age)"
    }
}

要想能够正常返回Self,首先遵循协议的类必须实现

required override init() {
        super.init()
}

返回必须用self.init()返回

static func createModel() -> Self {
        return self.init()
}

继承AModel类BModel,BModel依然能调用协议中的方法,并正确返回BModel的内容

import UIKit

class BModel: AModel {
    var birth = ""
    var address = ""
    override var description: String{
        return super.description + ",birth=\(birth), address=\(address)"
    }
    
    override func registerClassList() -> [SwiftKVCModelProtocol] {
        return []
    }
}

相关文章

网友评论

      本文标题:45.Swift遵循协议返回Self

      本文链接:https://www.haomeiwen.com/subject/fqioxxtx.html