操作员超载

运算符重载是Swift编程语言的强大功能之一。 从本质上讲,它基本上是对任何您想要的类型使用-,+,==,/,*运算符。 另外,您可以定义自己的运算符,并在项目中使用它们。 多么酷啊?

假设您有一个新闻项目,并且正在处理一些文章:

 结构文章{ 
变量ID = 0
var title =“”
var desc =“”

init(id:Int,title:String,desc:String){
self.id = id
self.title =标题
self.desc =说明
}
}
 让articleA = Article(id:1,标题:“ Title#1”,desc:“ Article description#1”) 
让articleB = Article(id:2,标题:“ Title#2”,desc:“ Article description#2”)
让articleC = Article(id:2,标题:“ Title#2”,desc:“ Article description#3”)

现在,我们需要检查两个文章是否相同,但是逻辑是,只有idtitle相同时,它们才是相同的。

可能,我们将使用if语句以老式的方式进行操作。

 如果articleB.id == articleC.id && articleB.title == articleC.title { 
打印(“文章相同”)
}其他{
打印(“文章不一样”)
}

有人会说这段代码没有错。 它按预期工作。 是的,那是真的。 假设我们在此示例中添加了另一件事–假设我们向类中添加了date属性,并且我们的业务逻辑是,如果两个对象中的id,title和date属性相同,则表示它们相同。

您立即注意到的一件事是,我们的if条件根本不是很优雅。 这是巨大且不可持续的。 向其中添加更多内容-假设我们在几个地方都有这段代码。 可怕。 我们绝对会违反DRY原则,该原则代表不要重做

让我们做一个函数:

  func compare(_ articleA:文章,与articleB:文章)-> Bool 
{
返回articleB.id == articleC.id && articleB.title == articleC.title && articleB.date == articleC.date
}

是的,功能可以解决问题。 现在,我们可以在任何需要的地方使用此功能。 另外,如果我们的业务逻辑再次更改-我们将只在一个地方更改它。

该代码如下所示:

 如果compare(articleB,with:articleC){ 
打印(“文章相同”)
}其他{
打印(“文章不一样”)
}

但是,在Swift中我们已经有一个比较运算符 ==运算符。 我们改用它不是很酷吗? 当然。

  func ==(左:文章,右:文章)->布尔{ 
返回left.id == right.id && left.title == right.title && left.date == right.date
}

让我们看一下我们的最终代码:

 如果articleB == articleC { 
打印(“文章相同”)
}其他{
打印(“文章不一样”)
}

现在我们有了一个优雅的解决方案。

在某些时候,我们都使用了那些沉重的if语句。 现在您已经看到了Swift运算符重载的强大功能,

希望您喜欢本教程。 祝你今天愉快!