Ios 面向协议的程序设计
当我们的大脑从Ios 面向协议的程序设计,ios,swift,model,protocols,Ios,Swift,Model,Protocols,当我们的大脑从面向对象编程过渡到面向协议编程时,我该怎么做 假设我有一个JSON对象,表示Model有{created\u time,updated\u time,type,…},这些值在5个模型对象中很常见 使协议包含上述所有属性是否正确,如下所示 protocol xxx { var type : String { get } var updatedTime : String { get } var createdTime : String { get } //...
面向对象编程
过渡到面向协议编程
时,我该怎么做
假设我有一个JSON
对象,表示Model
有{created\u time,updated\u time,type,…},这些值在5个模型对象中很常见
使协议包含上述所有属性是否正确,如下所示
protocol xxx {
var type : String { get }
var updatedTime : String { get }
var createdTime : String { get }
//...//
}
然后所有5个结构都符合这个协议我认为这是一个非常好的解决方案。另一种方法是使用一个具有这些属性的基类,并让所有五个模型都从基类继承,但这里没有特别的理由使用继承 协议只是保证类具有某些属性或行为的“契约”。对我来说,你在这里的例子感觉非常“契约性”
相比之下,继承意味着一种“是一种”关系(例如,福特是一辆车)。对我来说,这更像是一份合同,而不是一个“现状”案例。当然,这两种选择都没有错,但请认为您的协议思想是好的。说到面向协议的编程,Swift 2具有允许默认实现的协议扩展。这也代替了许多使用超类的情况 在这种情况下:
// extension of your example protocol
extension xxx {
var type : String { return "a type" }
var updatedTime : String { return "00:00" }
var createdTime : String { return "00:00" }
//...//
}
// struct which conforms to it
struct Astruct: xxx {}
// using the properties
Astruct().type
Astruct().updatedTime
如果所有属性和方法都有协议扩展的默认实现,那么您不必自己提供任何实现。但是,您只能通过实现它们来“覆盖”它们
所以你们的决定是正确的,你们应该尽可能多地使用协议
唯一的大缺点是没有
super
可以显式调用默认实现。解决方法(见此)需要一个超类,这使得协议几乎是冗余的。因为我使用的是结构,所以不能使用类。因为结构没有inheritanceRight,所以对于结构,使用这样的协议绝对是正确的选择。我想我会将面向协议的方法与类中可能使用的继承方法进行对比。问题是,这将是非常冗余的,因为我需要在每个结构中创建相同的5个属性。不幸的是,在协议中没有真正的解决方法。协议只承诺某个特定的行为会存在,它不会为您实现任何功能。通过继承可以避免这种冗余,但是(正如您指出的)Swift不支持结构继承。请投票回答您的问题。您是如何知道这些的呢??)我建议的一件事是,放弃把每件事都当作一根绳子的习惯。它很方便,但几乎可以保证以后会出现问题。“时间”应该是时间间隔或日期。当人们来自动态类型语言时,到处使用字符串似乎是一种情况,但长期坚持这不是一种健康的习惯。但是如果所有属性都没有默认实现呢?i、 假设我有var-iD:String!协议中的{get}
属性实现此协议的所有结构必须具有let\u id:String代码>和以后的varid:String{get{return{uid}}
假设协议中有5个属性和5个结构。这将是一个巨大的冗余@Qbyte@Bobj-为什么所有实现协议的类型都必须有let\u id:String代码>和变量iD:String!{get}
同时进行?如果您有一个特定的问题,请进一步解释。假设结构的init如下init(dictionary:JSON){…}
,因此如果我想读取值id
,并将其放入\u id
中,它将类似于\u id=JSON[“id”]
。因为这个结构实现了协议,所以它必须有var-iD:String{get{return{return\u-iD}}
@Bobj-C,您不必有\u-iD
变量,因为结构中的var-iD:String
变量足以符合它。它不需要计算属性。你是对的,我以前没有注意到,谢谢:)