社区首页 >问答首页 >UIViewController如何设法在Swift中拥有默认的无args初始化器?

UIViewController如何设法在Swift中拥有默认的无args初始化器?
EN

Stack Overflow用户
提问于 2015-02-06 09:46:15
回答 2查看 347关注 0票数 4

UIViewController类定义了一个指定的初始化器,init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?),而没有方便的初始化器,但是,可以编写以下代码并进行编译(Xcode 6.1.1)

let vc = UIViewController()

这怎麽可能?

根据Swift的书,下面是初始化继承的规则

如果您的子类没有定义任何指定的初始化器,则它会自动继承其所有超类指定的初始化器。 如果您的子类提供了其所有超类指定初始化器的实现--或者按照规则1继承它们,或者提供自定义实现作为其定义的一部分--那么它将自动继承所有超类方便初始化器。“ 摘录自:苹果公司。“斯威夫特编程语言”iBooks。https://itun.es/us/jEUH0.l

因此,UIViewController不可能从它的祖先超类NSObject继承init()方法,那么初始化器从哪里来?

另外,由于每个快速类最终都必须调用其指定的初始化器,这不意味着initWithCoder:也将调用init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)吗?然而,在实践中,情况似乎并非如此。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-06 10:31:28

Swift书中的规则适用于Swift中定义的类。UIViewController是从ObjC导入的类,因此它的行为受ObjC规则(或缺乏规则)的约束。

在ObjC中,指定的初始化器链接模式是您应该做的事情(与Swift中的编译器强制它是您唯一能做的事情不同)。如果您调用继承的初始化程序而不是指定的初始化程序,您将得到一个实例.但是,不能保证上述情况将处于合理的状态。(事实上,你几乎可以保证不会这样。)ObjC类的作者有时通过实现不应该调用的初始化器来进行防御性编码,并让它们抛出异常,但这里似乎并非如此。

这个特殊的案例可以说是某种类型的bug -- 向苹果公司提交一份文件并不是个坏主意。在从导入的ObjC API创建对象时,Swift应该强制执行初始化规则(在这种情况下,UIViewController需要用NS_DESIGNATED_INITIALIZER在ObjC中声明其指定的初始化器),或者应该实现UIViewController以防止不正确的初始化。(尽管有可能,“修复”这两种方法都会产生兼容性副作用。)

票数 5
EN

Stack Overflow用户

发布于 2015-02-06 10:32:56

init函数上面的注释块包含以下文本:

代码语言:javascript
代码运行次数:0
复制
/*
  The designated initializer. If you subclass UIViewController, you must call the super implementation of this
  method, even if you aren't using a NIB.  (As a convenience, the default init method will do this for you,
  and specify nil for both of this methods arguments.) ...
*/

据我理解,因为这是一个Objective类,所以允许它隐式继承方法。如果您快速创建该类的子类,您将无法访问super.init()。如果您在Objective代码中创建您的子类而没有实现您自己的-[ init],那么您将能够使用()构造您的子类。

因为您的项目与调用的类一起进入了Objective域,所以它能够找到选择器。一个目标-C类的快速子类只会遵循快速继承规则。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28371701

复制
相关文章
[接口测试 - 基础篇] 05 好讨厌的xml解析
概述 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据。 XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。 xml构成 XML由3个部分构成,它们分别是: 文档类型定义(Document Type Definition,DTD),即XML的布局语言 可扩展的样式语言(Extensible Style
苦叶子
2018/04/09
9720
libpcap试玩
libpcap驱动了tcpdump,和wireshark这类抓包工具.提供了高度灵活的包过滤语言. 据wikipedia,高性能的包过滤最早是在bsd上作为一个问题被解决,被称为bpf,在内核实现了一个解释器,进行包匹配,用户态提供一个字符设备, linux作为后来者,支持与bsd基本相同的packet filter,称为lpf,不同的是,linux是通过在一个raw socket来支持包过滤的,通过setsockopt来SO_ATTACH_FILTER,挂载过滤器. strace 可知,libpcap实际上进行了如下syscall:
byronhe
2021/06/25
7160
Winshark:一款用于控制ETW的Wireshark插件
Winshark Winshark是一款用于控制ETW的Wireshark插件,ETW(Event Tracing for Windows)提供了一种对用户层应用程序和内核层驱动创建的事件对象的跟踪记录机制。为开发者提供了一套快速、可靠、通用的一系列事件跟踪特性。Microsoft Message Analyzer早就已经过时了,而且它的下载包早在2019年11月25日也被微软从其官网上移除了。Wireshark建立了一个庞大的网络协议剖析器工具库,为了帮助广大研究人员更好地收集和分析各种类型的网络日志,W
FB客服
2023/04/26
1K0
Winshark:一款用于控制ETW的Wireshark插件
18C 也不能避免 SQL 解析的 Bug
在 Oracle 12.2 版本和新发布的18.0版本中存在一个 SQL 解析的 bug,导致了数据库后台报 ora-07445 或者 ora-00600 错误。报 ora-07445 时,可导致数据库断开当前会话连接,无法进行 SQL 操作,当报 ora-00600 时,会话没有断开,但无法完成解析返回结果。
数据和云01
2019/05/26
8030
电能表国标DLT698协议解析
响应:85 01 01 40 01 02 00 01 09 06 12 34 56 78 90 12 00 00
科控物联
2023/09/01
2.4K0
电能表国标DLT698协议解析
18C 也不能避免 SQL 解析的 Bug
作者简介 苏星开 云和恩墨南区交付技术顾问,曾服务过通信、能源生产、金融等行业客户,擅长 SQL 审核和优化,DataGuard 容灾等。 1 概述 在 Oracle 12.2 版本和新发布的18.0
数据和云
2018/03/07
1.1K0
18C 也不能避免 SQL 解析的 Bug
讨厌的ALG
这几天测试FreeSWITCH的Bypass Media功能,FreeSWITCH在公网上,客户端在私网,发现SDP数据被篡改,影响通话。
杜金房
2020/12/21
1.1K0
javascript的一些bug建议收藏
JavaScript是如今最受欢迎的编程语言之一,但受欢迎同时就是该语言自身的各种特性带来的副作用,无论该语言多美妙,每天还是有成千上万的程序员弄出一堆bug。先不要嘲笑别人,或许你也是其中之一。
全栈程序员站长
2022/07/15
2440
尽量避免bug的一些手法
最近参与了几个需求开发,BUG很少,有些需求没BUG,有些才一个BUG,搞的测试人员还发牢骚说:
Java团长
2019/01/23
8100
DLT645-2007
对于电能来说,DI0是结算日的信息,现在的就是写0,上一结算日的就写 01,上12结算日就写 0C
科控物联
2022/06/13
1.1K0
DLT645-2007
DLT645调试
DLT645-2007 端子2和10接单相电;通讯是24和25就可以测试了。 各种软件测试: 直接串口调试软件测试 厂家古老的测试软件 各个品牌网关测试 都只能一个变量一个变量的读???
科控物联
2022/06/13
5190
DLT645调试
ajaxFileUpload.js 的一些Bug
这里以前提到过 http://blog.csdn.net/qq_30930805/article/details/62427726
試毅-思伟
2018/09/06
6930
LAMP Linux路由和Libpcap配置
1、Ubuntu安装:sda会覆盖MBR,选择这个,sda1会导致找不到系统 2、配置路由 在/etc/rc.local 开机时候自动加载 sudo iptables -F  //清除所有规则 sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -t nat POSTROUTING -o eth1 -j MASQUERADE 具体内容忘记了 eth1 为 wan口网卡
星哥玩云
2022/06/30
4.2K0
Libpcap PACKET_MMAP内存分配
libpcap为了提高效率,调用setsockopt(handle->fd, SOL_PACKET, PACKET_RX_RING,(void *) &req, sizeof(req))时采用kmalloc分配内存。 可以参考: https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt kmalloc底层依赖linux的slab内存分配机制,在2.6.22内核之后,slub取代slab成为默认的内存分配器。空间和时间上都有所提升。
happy123.me
2018/06/04
1.4K0
JSON金额解析BUG的解决过程
这是在我们开发的一个支付系统中暴露的一个BUG,问题本身比较简单,有意思的是解决问题的过程。将过程分享出来,希望能够对大家有所帮助。
程序猿讲故事
2019/09/27
1.1K0
JSON金额解析BUG的解决过程
Shell之讨厌的正则
思想(KISS)相当重要。KISS(keep it simple stupid)。 这是其实不难,只要按照一下思路进行就ok。
后场技术
2020/09/03
4750
Shell之讨厌的正则
BibTeX条目类型
使用 BibTeX 时,各大参考文献检索网站经常会给出不同的 BibTeX 条目类型,本文便就 BibTeX 的各种条目类型及其说明进行摘录。
hotarugali
2022/11/23
4330
深度学习跟踪DLT (deep learning tracker)
粒子滤波是对预测粒子进行评价,添加不同的权重,越接近于真实状态的粒子,其权重越大;否则,就加的权重小一些。步骤:
代码的路
2022/08/23
7500
解决ueditor上传视频、音频的一些bug
使用ueditor上传视频和音频功能之前一直没有用,也没有去搞因为用不太着。现在想上传个视频就搞了一下都是在网上找的方法一步一步的试,花了几个小时终于好了。记录下怎么改的。
sunonzj
2022/06/21
1.9K0
知名系统中的一些有趣bug
产品的绝大部分bug,会在测试阶段被消灭,但仍然有不少的bug,脱离测试工程师的魔掌,展现在了用户面前。有些bug十分影响用户体验,不过有些bug,反而会娱乐大众,让人笑翻了天。
良月柒
2019/03/20
5970
知名系统中的一些有趣bug

相似问题

防止用户切换TabItem +讨厌的bug?

20

React讨厌的bug,我搞不懂

222

KD的构建程序中的讨厌的bug

16

grails ajax功能--一个“讨厌的bug”

10

代码中的一些错误- libpcap

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文