swift3.0 后基础语法 / 变化 - 可选链和协议 四

本贴最后更新于 3096 天前,其中的信息可能已经时移世异
//      一,可选链 //可选连的概念 // //它的可选性体现于请求或调用的目标当前可能为空(nil) //如果可选的目标有值,那么调用就会成功; //如果选择的目标为空(nil),则这种调用将返回空(nil) //多次调用被链接在一起形成一个链,如果任何一个节点为空(nil)将导致整个链失效。 //可选链的使用 //在可选类型后面放一个问号,可以定义一个可选链。 //这一点很像在可选值后面放一个叹号来强制拆得其封包内的值 //它们的主要的区别在于当可选值为空时可选链即刻失败 //然而一般的强制解析将会引发运行时错误。 //因为可选链的结果可能为nil,可能有值.因此它的返回值是一个可选类型. //可以通过判断返回是否有值来判断是否调用成功 //有值,说明调用成功 //为nil,说明调用失败 //1.创建类 class Person{     var name : String = ""     var dog : Dog? } class Dog{     var name : String = ""     var toy : Toy? } class Toy{     var price : Double = 0.0 {         didSet{             print(price)         }     }     func run() {         print("玩具跑!")     } } //2.创建对象 let p = Person() p.name = "AOLIU" let dog = Dog() dog.name = "XIAOHuang" let toy = Toy() toy.price = 100.0 //3.让对象产生关系 p.dog = dog dog.toy = toy //4.可选链的使用 //给这个人的狗的玩具赋值一个新值 //p.dog!.toy!.price = 20.0 //可选链: //1.每一个可选类型进行判断,判断是否有值,如果有其中一个可选类型没有值,那么整个表达式返回一个nil //2.如果所有的可选类型都有值,那么整个表达式返回对应的类型,就可以给类型进行赋值 p.dog?.toy?.price = 30.0 //5.取出玩具的价格 //1.判读所有的可选类型是否有值,如果其中一个没有值,则可选链返回一个nil //2.如果可选类型都有值,会返回具体值 //let price = p.dog!.toy!.price let price = p.dog?.toy?.price  //取出的是可选类型 let url = URL(string: "") print(url ?? "hahah") //6.调用方法:同上 p.dog?.toy?.run() //7.练习 let btn = UIButton() btn.setTitle("hahah", for: .normal) let title = btn.titleLabel?.text //8.自定义button class MyBtn : UIButton{     override func layoutSubviews() {         super.layoutSubviews() //        var titleFrame = titleLabel?.frame //        titleFrame?.origin.x = 0 //        titleLabel?.frame = titleFrame!         //oc对象结构体的成员属性不能直接赋值         titleLabel?.frame.origin.x = 0     }      } //          二.协议 //协议的格式 //协议的定义方式与类,结构体,枚举的定义都非常相似 protocol SomeProtocol {     // 协议方法 } //遵守协议的格式 //class SomeClass: SomeSuperClass, FirstProtocol,AnotherProtocol {     // 类的内容     // 实现协议中的方法 //} //1.定义协议 protocol SportProtocol {     func playBasketball()     func playFootball() } // 2.遵守协议 // 注意:默认情况下在swift中所有的协议方法都是必须实现的,如果不实现,则编译器会报错 class Person1 : SportProtocol {     var name : String?     var age : Int = 0          // 实现协议中的方法     func playBasketball() {         print("人在打篮球")     }          func playFootball() {         print("人在踢足球")     } } //代理设计模式 //协议继承用于代理设计模式 protocol BuyTicketProtocol :class {//:class表示这个协议只能是类来遵守     func buyTicket() } class Person2 {     // 1.定义协议属性     //weak var delegate : BuyTicketProtocol //为了防止循环使用,使用weak结果不行,swift不能这样使用     var delegate : BuyTicketProtocol//swift中直接使用协议,要想成为代理必须遵守协议          // 2.自定义构造函数     init (delegate : BuyTicketProtocol) {         self.delegate = delegate     }          // 3.行为     func goToBeijing() {         delegate.buyTicket()     } } class XieCheng: BuyTicketProtocol {//遵守协议必须实现协议方法     func buyTicket() {         print("买了一张火车票")     } } let p2 = Person2(delegate: XieCheng()) p2.goToBeijing() // 协议中方法的可选性 // 1.定义协议 @objc //表示协议保存oc特性 protocol SportsProtocol {     func playBasketball()          @objc optional func playFootball() //这个方法是可选的 } // 2.遵守协议 class Person3 : SportsProtocol {         var name : String?     var age : Int = 0          // 实现协议中的方法     func playBasketball() {         print("人在打篮球")     } //    func playFootball() { //        print("踢足球") //    } } let p3 = Person3() p3.playBasketball() //p3.playFootball()
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 555 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    371 引用 • 1857 回帖 • 2 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 677 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 729 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 3 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 4 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    299 引用 • 764 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 341 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    43 引用 • 44 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 124 关注
  • Anytype
    3 引用 • 31 回帖 • 26 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 35 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 260 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    497 引用 • 934 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 252 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 6 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖 • 2 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 182 关注