子类化与协议之间的区别

4
让我们从“Class”方法开始:

请注意,这里的“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 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
}
}

我只需要知道哪一个更快?


协议通常用于委托。在我看来,这里的子类化是更好的选择。 - milo526
@milo526,协议远不仅用于委托。那是一种非常“Objective-C”的看待事物的方式。我建议你观看https://developer.apple.com/videos/play/wwdc2015-408/或阅读http://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2来了解更多内容。 - drewag
3个回答

2
最终,这两种方法都不是“更Swift”的。在Swift中,有时候你会想使用继承,有时候你会想使用协议。这两种方法的真正决策点是:
你想要值类型语义(结构体和协议)还是引用类型语义(类和协议)。我通常默认使用值类型语义,因为它们更安全,但肯定有一些情况下引用类型语义很重要。你可以在这里阅读更多信息:为什么选择结构体而不是类

2

在Swift中,两者都可以接受。

以下是区分两者的方法。

当使用协议时,您希望将其视为对象的蓝图。

棒球运动员必须知道什么是球,因此任何想成为棒球运动员的人都必须知道什么是球。

如果您希望某些对象遵循一组规则,请制定协议。

如果您想要具有功能的对象,并且希望子类继承此功能并具有更多功能,则使用继承类结构。

父亲能以100MPH的速度投掷球 儿子可以以100MPH的速度投掷球并投弯曲球。

这应该使用类而不是协议来完成。


这个答案似乎没有考虑协议扩展的想法。仍然可以向协议添加功能,只是不能使用继承。 - drewag
这是因为扩展协议超出了协议的能力范围,所以它需要在扩展中完成。 - Knight0fDragon

1
结构实例总是按值传递,而类实例总是按引用传递。这意味着它们适合不同类型的任务。在考虑项目所需的数据结构和功能时,请决定每个数据结构应该定义为类还是结构。
作为一般准则,当满足以下一个或多个条件时,请考虑创建结构:
结构的主要目的是封装一些相对简单的数据值。 当您分配或传递该结构的实例时,可以合理地期望封装的值将被复制而不是引用。 由结构存储的任何属性本身都是值类型,也应该被复制而不是引用。 结构不需要从另一个现有类型继承属性或行为。 适合结构的示例包括:
  • 一个几何形状的大小,可能封装了宽度属性和高度属性,都是 Double 类型。
  • 一种引用系列中范围的方式,可能封装了起始属性和长度属性,都是 Int 类型。
  • 一个三维坐标系中的点,可能封装了 x、y 和 z 属性,每个属性都是 Double 类型。

在所有其他情况下,定义一个类,并创建该类的实例以进行管理和通过引用传递。在实践中,这意味着大多数自定义数据结构应该是类,而不是结构体。

为什么选择结构体而不是类?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接