让我们从Class
方法开始:
class LoginCredentials {
var id : String
init(userID:String) {
self.id = userID
}
}
然后我们将有以下内容:
class FacebookLoginCredentials : LoginCredentials {
var token : String
init(userID:String,userToken:String) {
self.token = userToken
super.init(userID: userID)
}}
和
class TwitterLoginCredentials : LoginCredentials {
var token : String
var secret : String
init(userID:String,userToken:String,secret : String) {
self.token = userToken
self.secret = secret
super.init(userID: userID)
}
}
如果我没错,第二种方法是Protocol Oriented
protocol LoginCredentials {
var id : String { get }
}
然后我们将:
struct FacebookLoginCredentials : LoginCredentials {
var id: String
var token : String
init(userID:String,userToken:String) {
self.id = userID
self.token = userToken
}
}
和
struct TwitterLoginProfile : LoginCredentials {
var id: String
var token : String
var secret : String
init(userID:String,userToken:String,secret : String) {
self.token = userToken
self.secret = secret
self.id = userID
}
}
我只需要知道哪一个更像Swift?
答案 0 :(得分:2)
快速接受或接受。
以下是您希望与两者区别开来的方法。
使用Protocols时,您希望将它们视为对象的蓝色打印。
Ballplayers must know what a ball is, so any person that wants to be a Ballplayer must know what a ball is.
您希望某些对象遵循一套规则,制定协议。
如果您想创建具有功能的对象,并且您希望子级具有固有的此功能,然后具有更多功能,那么请执行inheret类结构。
Dad can throw a ball at 100MPH
Junior can throw a ball at 100MPH and throw a curve ball.
这可以通过类来完成,而不是使用协议
答案 1 :(得分:2)
最终,这些方法都不是“更加迅捷”。在Swift中,有时您会想要使用继承,有时您会想要使用协议。这两种方法的真正决定点是:
您是否需要值类型语义(结构和协议),还是需要引用类型语义(类和协议)。我通常默认使用值类型语义,因为它们更安全但是肯定存在引用类型语义很重要的情况。您可以在此处详细了解:Why Choose Struct over Class。
答案 2 :(得分:1)
结构实例始终按值传递,类实例始终通过引用传递。这意味着它们适用于不同类型的任务。在考虑项目所需的数据结构和功能时,请确定是将每个数据结构定义为类还是结构。
作为一般准则,请考虑在满足以下一个或多个条件时创建结构:
该结构的主要目的是封装一些相对简单的数据值。 当您分配或传递该结构的实例时,期望复制封装的值而不是引用是合理的。 结构存储的任何属性本身都是值类型,也可以复制而不是引用它们。 该结构不需要从另一个现有类型继承属性或行为。 结构的良好候选者的例子包括:
- 几何形状的大小,可能封装了width属性和height属性,两者都是Double。
- 一种引用系列中范围的方法,可能封装了一个类型为Int的起始属性和长度属性。
- 3D坐标系中的一个点,可能包含x,y和z属性,每个属性为Double。
在所有其他情况下,定义一个类,并创建该类的实例 通过引用进行管理和传递。在实践中,这意味着 大多数自定义数据结构应该是类,而不是结构。