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
变量足以符合它。它不需要计算属性。你是对的,我以前没有注意到,谢谢:)