阅读更多

1顶
0踩

移动开发
Objective-C中的protocol里存在@optional关键字,被这个关键字修饰的方法并非必须要被实现。我们可以通过接口定义一系列方法,然后由实现接口的类选择性地实现其中几个方法。在Cocoa API中很多情况下接口方法都是可选的,这点和Swift中的protocol的所有方法都必须被实现这一特性完全不同。



那些如果没有实现则接口就无法正常工作的方法一般是必须的,而相对地像作为事件通知或者对非关键属性进行配置的方法一般都是可选的。最好的例子我想应该是UITableViewDataSource和UITableViewDelegate。前者中有两个必要方法:
-tableView:numberOfRowsInSection:
-tableView:cellForRowAtIndexPath:

分别用来计算和准备tableView的高度以及提供每一个cell的样式,而其他的像是返回section个数或者询问 cell 是否能被编辑的方法都有默认的行为,都是可选方法;后者(UITableViewDelegate)中的所有方法都是详细的配置和事件回传,因此全部都是可选的。

原生的Swift protocol里没有可选项,所有定义的方法都是必须实现的。如果我们想要像Objective-C里那样定义可选的接口方法,就需要将接口本身定义为Objective-C的,也即在protocol定义之前加上@objc。另外和Objective-C中的@optional不同,我们使用没有@符号的关键字optional来定义可选方法:
@objc protocol OptionalProtocol {
    optional func optionalMethod()
}

另外,对于所有的声明,它们的前缀修饰是完全分开的。也就是说你不能像是在Objective-C里那样用一个@optional指定接下来的若干个方法都是可选的了,必须对每一个可选方法添加前缀,对于没有前缀的方法来说,它们是默认必须实现的:
@objc protocol OptionalProtocol {
    optional func optionalMethod()  // 可选
    func necessaryMethod()          // 必须
    optional func anotherOptionalMethod() // 可选
}

一个不可避免的限制是,使用@objc修饰的protocol就只能被class实现了,也就是说,对于struct和enum类型,我们是无法令它们所实现的接口中含有可选方法或者属性的。

作者:王巍(@onevcat),iOS和Unity3D开发者。

本文转载自:Swifter
  • 大小: 11.9 KB
来自: Swifter
1
0
评论 共 1 条 请登录后发表评论
1 楼 wwq100 2015-02-16 19:01
这是为什么呢

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Swift VS Objective-C

    Swift 注重安全性,而Objective-C注重灵活性,Swift有函数式编程,面向对象编程,和面向协议编程,而Objective-C 几乎只有面向对象编程,Swift更注重值类型的数据结构,而Objective-C 遵循c语言的老一套,注重指针和...

  • swift c语言混编,Swift和Objective-C混编

    翻译自苹果官方文档和Objective-C交互互用性是指,在Swift和Objective-C之间可以建立一个互通接口,不管是Swift生成接口给Objective-C对接,还是Objective-C生成接口给Swift对接。既然你决定开始用Swift来开发,那么...

  • 如何在Swift协议中定义可选方法?

    Is it possible in Swift? 在Swift中有可能吗? If not then is there a workaround to do it? 如果没有,那么是否有解决方法?

  • 无需改写已有代码,4步从Objective-C过渡到Swift!

    无需改写已有代码,4步从Objective-C过渡到Swift!

  • 在 Swift 中使用 Objective-C 风格的异步 API

    作者:Ole Begemann,原文...许多 Objective-C 风格的异步 API 会在它们的回调闭包中传入两个可选类型值:一个代表操作成功时方法的返回值,另一个代表操作失败时返回的错误值。 一个例子是 Core Location 框架中的 ...

  • Swift项目兼容Objective-c问题汇总

    Swift项目需要使用封装好的Objective-c组件、第三方类库,苹果提供的解决方案能够处理日常大部分需求,但还不能称之为完美,混编过程中会遇到很多问题。本文将Swift兼容Objective-c的问题汇总,以帮助大家更好的使用...

  • Swift与Objective-C API的交互

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言。当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 Cocoa 应用的...

  • Objective-C 中 Nullability 和 Swift 中的 ? or !

    1.在Swift中对于option和non-option有着很明显的区分,例如NSView!(NSView对于Swift而已也是non-option的)和NSView?,但是OC中只有一个写法就是NSView ,即可以表示option,也可以表示non-option的,那么问题...

  • Swift项目兼容Objective-C问题汇总

    使用继承可以支持所有的Swift类型,主要的功能在Objective-c中实现,不支持的语法在Swift文件中调用,例如,ILLoginSuperController做为父类 @interface ILLoginSuperController : UIViewController ...

  • Swift和Object-C的区别和优缺点

    一、Swift和Objective-...其次就是,OC之前积累的很多类库,在Swift中大部分依然可以直接使用,当然,Swift3之后,一些语法改变了很多,不过还是有迹可循的。OC出现过的绝大多数概念,比如引用计数、ARC、属性、协议...

  • 将Swift与Objective-C相结合

    原文: Swifty Objective-C 作者: Peter Steinberger / Michael Ochs / Matej Bukovinski,感谢作者对本文的翻译授权 译者: 孙薇 审校: 唐小引(@唐门教主),欢迎技术投稿、约稿,给文章纠错,请发送邮件...

  • Objective-C Runtime2.0(-)简介

    相关资料引用 ...https://developer.apple.com/videos/play/wwdc2020/10163/Objective-C一门动态语言, 它能在编译的时候转换为对应

  • 混合使用Objective-C,C++和Objective-C++ 以及错误Unknown type name ‘class‘; did you mean ‘Class‘?

    有时我们需要在OC的程序中使用已有的C++类,这时,我们可以把OC类的.m文件后缀改为.mm,就可以在里面使用C++类了。但是二者直接混用会出现一些问题以致编译无法通过,这时可以简单的通过把target中的compile source ...

  • 浅谈 Swift 2 中的 Objective-C 指针

    浅谈 Swift 2 中的 Objective-C 指针 2015-09-07499 文章目录 1.在 Swift 中读 C 指针 2.在 Swift 中创建 C 指针 3.总结 作者:Jameson Quave,原文链接,原文日期:2015/08/23译者:mmoaay;校对:...

  • Swift开发指南:使用Swift与Cocoa和Objective-C(Swift 4) - 2.互通性

    与Objective-C API进行交互互操作性是能够在任何一个方向上与Swift和Objective-C进行接口,让您访问并使用以其他语言的文件中的一些代码。当您开始将Swift集成到应用程序开发工作流程中时,了解如何利用互操作性来...

  • Swift 与Objective-c语法参照

    Swift已经推出了一段时间了,今天来总结一下Swift与Objective-c(以下简称OC)的语法有哪些不同。 1.常量与变量: 在Swift中定义常量和变量很简单,常量使用let关键字,变量使用var关键字。 var numberOfRows = 30...

  • Crawlee - 一个用于 Python 的网页抓取和浏览器自动化库,用于构建可靠的爬虫 提取 AI、LLM、RAG 或 GPT 的数据 从网站下载 HTML、PDF、JPG、PNG

    Web scraping and browser automation librarylee 涵盖了端到端的抓取和爬取,并帮助您快速构建可靠的爬取工具。 Crawlee for Python 向早期采用者开放!即使使用默认配置,您的爬虫程序看起来也几乎像人类一样,并且不会受到现代机器人保护的监视。Crawlee 为您提供了工具,让您可以抓取网络上的链接、抓取数据并以机器可读的格式持久存储数据,而无需担心技术细节。而且,由于配置选项丰富,如果默认设置不适用,您可以调整 Crawlee 的几乎任何方面以满足您的项目需求。在Crawlee 项目网站上查看完整的文档、指南和示例我们还有一个 TypeScript 实现的 Crawlee,您可以探索并利用它来完成您的项目。请访问我们的 GitHub 存储库,获取有关GitHub 上 JS/TS 的 Crawlee 的更多信息。安装我们建议您访问Crawlee 文档中的简介教程以获取更多信息。Crawlee 可作为crawleePyPI 软件包使用。核心功能包含在基础软件包中,其他功能作为可选附加功能提供,以最大限度地减少软件包大小和依赖项。要安装

  • 用AWLUM进行灰色编码2^2n-QAM调制的精确率Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

  • Simple Run Blocker -应用上锁工具

    Simple Run Blocker -应用上锁工具

Global site tag (gtag.js) - Google Analytics