推广

Swift进阶(十五)扩展(Extension)

iseeyu2年前 (2024-02-21)推广124

image.png

那我们应该怎样去处理呢?
由于所有的整数都遵守BinaryInteger协议,所有我们可以:
□ 第一种方法,使用泛型,并限定泛型

func isOdd<T: BinaryInteger>(_ i: T) -> Bool {
    (i % 2) != 0
}

□ 给BinaryInteger协议添加扩展,这种方式是比较好的

extension BinaryInteger {
    func isOdd() -> Bool {
        (self % 2) != 0
    }
}

print(3.isOdd())
/*输出结果*/
true
  • 扩展可以给协议提供默认实现,也间接实现可选协议的效果
  • 扩展可以给协议补充协议中从未声明过的方法
protocol MyProtocol {
    func fun1()
}

extension MyProtocol {
    func fun1() {
        print("MyProtocol fun1")
    }
    func fun2() {
        print("MyProtocol fun2")
    }
}

我们都知道,只要遵守了协议,就必须实现协议中声明的方法;但是我们可以在协议的扩展中提供默认实现,这样就可以实现可选协议:

class Person: MyProtocol {}
var p = Person()
p.fun1() // MyProtocol fun1
p.fun2() // MyProtocol fun2

当然,如果我们再类里面去实现协议的方法,那么执行的还就执行类里面的实现:

class Person: MyProtocol {
    func fun1() {
        print("Person fun1")
    }
    func fun2() {
        print("Person fun2")
    }
}
var p = Person()
p.fun1() // Person fun1
p.fun2() // Person fun2

这里有一个 要注意一下:
如下,p声明为遵守MyProtocol协议类型,实际是Person;但是在调用方法的时候,没有在MyProtocol协议中声明但是在扩展中有默认实现的方法,对象p去调用的话,会执行协议扩展中的默认方法。

var p: MyProtocol = Person()
p.fun1() // Person fun1
p.fun2() // MyProtocol fun2

这是因为,fun2在协议中没有声明,那么编译器就不确定遵守它的类是否有实现该方法,所有优先执行协议扩展中实现的默认方法。
如果var p = Person(),这样写,并没有告诉编译器是遵守MyProtocol协议的对象,只是告诉编译器是Person对象,所以优先执行Person里面的方法。

泛型

class Stack<E> {
    var elements = [E]()
    func push(_ element: E) {
        elements.append(element)
    }
    func pop() -> E {
        elements.removeLast()
    }
    func size() -> Int {
        elements.count
    }
}

// 扩展中依然可以使用原类型中的泛型类型
extension Stack {
    func top() -> E {
        elements.last!
    }
}

// 符合条件才扩展
extension Stack : Equatable where E : Equatable {
    static func == (left: Stack, right: Stack) -> Bool {
        left.elements == right.elements
    }
}

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://0291.com.cn/post/56644.html

返回列表

上一篇:iOS文件管理

下一篇:iOS KVC和KVO

相关文章

小编分享在顺义做网站建设的流程是什么。

小编分享在顺义做网站建设的流程是什么。

  网站设计的基本步骤是什么?   1.域名:要建立网站,您要拥有自己的域名。 该域名在Internet上是唯一的。 谁先注册谁有权使用它。 在建立网站之前,您应该首先申请一个域名。 拥有域名后,可以将网站放置在Web服务器上。 浏览器只需要在浏览器中输入域名,您就可以随时随地...

软文及新闻发布平台有哪些推荐?

软文及新闻发布平台有哪些推荐?

为了帮助用户更好的做好与,更快速掌握新闻投放方法,喜传播媒体投放平台做了全新升级。本次升级升级增进新业务啦!5大升级亮点:1、投放平台新增“小红书,短视频,代写稿件,百科问答等”,全推广一键投放平台有新功能全渠道推广一键投放,将在投放管理平台后台新增“小红书,短视频,代写稿...

2022年SEO网站分类的完整指南。

2022年SEO网站分类的完整指南。

对于那些从事 SEO 一段时间的人来说,您可能听说过网站分类法,因为它指的是网站。 当您提到网站的结构以及用户浏览的难易程度时,您指的是网站的分类。 关注您的网站分类是 SEO 专业人员掌握的一项关键技能。 这是因为网站的分类不仅会影响其整体组织结构,还会影响搜索引擎对它的看法以及用...

转危为机:零售银行客户经营和营销管理的模式升级

转危为机:零售银行客户经营和营销管理的模式升级

转危为机:零售银行客户经营和管理的模式升级课程背景:随着武汉新冠病毒疫情的爆发和蔓延,整体社会经济都受到了较大的冲击。当前环境下,如何在做好自身防护和公益贡献的同时,对传统的经营模式和客户关系进行调整、升级和强化,成为各行各业都需要认真思考的命题。近年来,银行零售业务在保持...

怎样做网站SEO优化才会有效果。

怎样做网站SEO优化才会有效果。

近年来,我国有许多中小企业逐步建立起来,鼓励。现在各行各业的市场竞争都很激烈,如果想要占据一席之地,不仅需要做好网络推广营销,更要做好seo优化。那中小企业咋做seo优化才会有好效果呢?小编在下文为大家介绍吧。 中小企业应怎样做好自己的网站SEO的效果? 首先,了解自己的行业情况和产品...

学习有钱人这7个思维方式,说不定你也会变得更富有

相信你和我的终极目标都是一样,就是能够成为一个“财务自由”的人。但问题是,我们要怎么做,才能够实现这个“终极目标”呢?毕竟每天上班、下班,似乎很难实现这个目标的。最近我就看了一本书,叫《有钱人有什么不一样》,作者叫keith Cameron Smith,他的工作让他接触了很...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片