在 Swift 1.1 中重写初始值设定项的正确方法

2024-03-15

这曾经在 Xcode 6.1 beta 中工作:

class MainViewController: NSViewController {
  convenience override init() {
    self.init(nibName: "MainView", bundle: nil)
  }
}

当我切换到 6.1 GM2 后,它无法编译。看起来这个问题与“可失败的初始化器 https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-XID_683” 在 Swift 1.1 中引入。我已经尝试过convenience override init?(), convenience init?() and override init?(),都不起作用。

那么截至目前,重写此类初始化程序的正确方法是什么?


你正在尝试实施init()— 一个不可失败的初始化器 — 通过委托给init?(nibName:bundle:),这是一个失败的初始化器。这不起作用:如果super.init调用失败,你会留下一个未初始化的实例,这是 Swift 不允许的。

或者换句话说,使用可失败初始化程序的结果是可选的,并且您不能使用可选值来代替非可选值。在类初始化和继承的情况下,您不能替换非可选的self对于可选的 - 您只能委托设置self的状态到不同的初始值设定项。

相反,你可以通过一点歌舞来消除可选性/失败性:

class MainViewController: NSViewController {
    override init!(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // check state here and provide app-specific diagnostic if it's wrong
    }
    convenience override init() {
        self.init(nibName: "MainView", bundle: nil)
    }

    // need this, too, or the compiler will complain that it's missing
    required init?(coder: NSCoder) {
        fatalError("not implemented") // ...or an actual implementation
    }
}

An init!初始化器生成一个隐式解包的可选(IUO)——就像 IUO 类型可用于在使用可选值和非可选值的代码之间建立桥梁一样,init!初始化器可以在可失败初始化器和不可失败初始化器之间建立桥梁。您不能将不可失败的初始化程序委托给可失败的初始化程序,但可以将不可失败的初始化程序委托给init!初始化器和来自init!初始化器为可失败的初始化器。

在这里,NSViewController你想要使用的初始化程序是完全失败的,所以你用一个覆盖它init!初始化程序。然后,您可以声明一个不可失败的convenience init委托给您的新init!初始化程序。


我们常常倾向于避免 IUO,进而推而广之init!初始化器,因为我们通常希望显式允许(并要求处理)失败或显式禁止它。然而,IUO 及其同类最强大的一般用例之一是将仅在源代码外部保证的条件转变为代码可以视为万无一失的断言。IBOutlet就是一个很好的例子——在你的笔尖/故事板中,你可以保证你的状态IBOutlet变量,但编译器不知道这一点——就像与捆绑资源有关的任何其他事情一样。

这个小小的委托舞蹈将失败的负担放在代码中一个特定的、易于调试的位置——如果来自init() to super.init(nibName:bundle:)失败,你的应用程序将会崩溃。但是您可以预期该调用仅在非常特定的(并且主要是在开发时)条件下才会失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 1.1 中重写初始值设定项的正确方法 的相关文章

  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前
  • 如何在 Swift 中使用未知密钥解码 JSON 响应?

    我想将数据拆分为https blockchain info ticker https blockchain info ticker这样每一行都是它自己的String在一个数组中 我正在制作一个获取所选货币价格的应用程序 因此 如果有人想要澳
  • 如何去掉 UIWebView 上的状态栏背景?

    从 iOS 11 开始 当UIWebView全屏时 状态栏上会出现与屏幕颜色相同的假背景UIWebView背景 有人知道如何摆脱它吗 甚至添加IUWebView到故事板并使其全屏将使状态栏背景出现 我一直在尝试编辑 UIWebView 的大
  • UITableView 快速获取 titleForHeadersInSection

    我想在 UITableView 的部分中设置标题的标题 语法是什么swift设置该部分中标题的标题 func tableView tableView UITableView titleForHeaderInSection section I
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • Swift 3 中的 JSON 解析

    有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法 我已经能够返回数据 但在将数据分解为特定字段时我没有成功 我会发布示例代码 但我已经尝试了很多不同的方法但没有成功 并且没有保存任何代码 我想要解析的基本格式是这样的 提
  • 在 swift 中将简单字符串转换为 JSON 字符串

    我知道有一个同标题的问题here https stackoverflow com questions 30825755 convert string to json string in swift 但在那个问题中 他试图将字典转换为 JSO
  • 如何使用完成处理程序等待 firestore 请求的完成

    我正在慢慢地了解完成处理程序 如果我有一个 firestore 查询 如果我想使用完成处理程序 则有点向后工作 当 firestore 查询完成时 我必须使用completion 但它的设置功能仍然让我感到困惑 因此 如果这是一个将闭包作为
  • 我的游戏中应该有多少个视图控制器?

    我开始使用 spritekit 构建我的第一个游戏 现在我只有一个视图控制器来呈现开始屏幕场景 override func viewDidLoad super viewDidLoad let scene StartScreenScene C
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • NVActivityIndi​​catorView 仅适用于特定视图

    我正在使用这个库https github com ninjaprox NVActivityIndi catorView https github com ninjaprox NVActivityIndicatorView用于显示加载指示器
  • 在现有 iOS 应用程序中集成 React-native(0.40.0) 后找不到 Yoga/Yoga.h 头文件

    在我的 Swift iOS 应用程序中集成 React Native 后 我无法构建 yoga Yoga h file cannot be found 我已经浏览了文档 查看了react native github页面 检查了类似问题的SO
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • Swift 使用哪种通用排序算法?它在排序数据上表现不佳

    我一直在挑选和探索 Swift 标准库sort 其函数为Array类型 令我惊讶的是 我注意到它在已经排序的数据上表现不佳 对数组进行排序Int打乱顺序似乎比对已经排序的同一个数组进行排序快 5 倍 对已打乱顺序的对象数组进行排序比对已按排

随机推荐

  • 使用正则表达式或类似表达式更改 Chrome 中的当前 URL

    当在 Chrome 中输入已弃用的 URL 时 应根据正则表达式或类似表达式将其更改为更新的 URL 我想做以下事情 向系统输入一条规则 将 olddomain com 更改为 newdomain com 在 Chrome 中输入 oldd
  • 当插入符进入 contenteditable div 中的 span 元素时触发事件

    我有一个内容可编辑的 div 其跨度如下 div some span spanned span text div 我想知道是否有任何事件监听器可以附加到span元素本身可用于检测插入符是否在元素内部移动span元素 我并不是在寻找有听众的答
  • 在 Web 服务中使用 JSON 字节数组以及 application/x-www-form-urlencoded

    有3个问题 我正在使用 Java Restful Web 服务 请求是 HTTP POST 客户端如何发送 JSON 数据以及 application x www form urlencoded 的 MediaType 使用字节数组是否可以
  • 按 EditText 时的 TimePicker 对话框

    这个问题以前曾被问过 但当时的答案似乎不再适用于 Android Studio 或者我错过了一些东西 我希望当您按下编辑文本区域时显示一个 timePicker 对话框 以在 editText 中设置时间 然而 由于某种原因 普通键盘在按下
  • 使用自动热键捕获右键单击+左键单击;意外的行为

    我想捕获关键事件 按下鼠标右键 然后按下鼠标左键 自动热键没有问题 然而 我仍然无法让鼠标右键单独工作 1 这有效 RButton LButton Send X Return 按预期工作 如果我按下鼠标右键 然后按下鼠标左键 X 将发送到活
  • HTML5 语法验证

    我正在验证一些 HTML 并注意到一些我不熟悉的新错误 这些列表项会根据用户输入使用 JavaScript 进行填充 Element li缺少以下一项或多项属性 aria checked aria expanded aria valuema
  • R 中最快的列排序

    我有一个数据框full我想从中取出最后一列和一列v 然后我想对两列进行排序v以尽可能最快的方式 full从 csv 中读取 但这可以用于测试 包括一些真实性的 NA n lt 200000 full lt data frame A runi
  • 基本 CSS 功能在 IE8 中不起作用

    我在这里完全不知所措 我正在开发一个网站 需要支持大量使用 IE8 的用户 一切都可以在 IE9 及更高版本以及 Chrome Firefox 和 Safari 中运行 但我一生都无法获得基本的 CSS 例如高度属性 来在 IE8 中一致工
  • 如何创建从左下角到右上角的动态对角线?

    我创建了一个简单的布局 其中有三个可以交互的 div 一个是屏幕中间的徽标 另一个是使用 jQuery 将两个块移出屏幕 我用的是skewCSS 中应用度数转换的选项 我想根据屏幕应用一定的程度 因此该程度将正确应用于所有屏幕 视觉示例 h
  • 如何使用TabNavigator的tabBarComponent?标签栏不显示

    我正在尝试制作自己的自定义选项卡栏 似乎 tabBarComponent 是通过设置为我自己的组件来实现此目的的方法 使用下面的代码我的标签栏不会显示 const TabNav TabNavigator LaunchScreen scree
  • 查询SQL Server上存储过程的内容

    我正在探索一个遗留数据库系统 对其内部结构知之甚少 我想找到调用另一个存储过程的所有存储过程A 如何最好地做到这一点 我可以写这样的伪代码吗 select name from AllStoredProcedures as Asp where
  • 为什么 C++ 中必须声明函数,而 C 中则不然?

    所以我之前的一次考试有这个问题 到目前为止我一直在读你不需要任何语言的声明 哪个是对的 如果没有声明 C 会报错还是会运行 在涉及 C 和 C 的讨论中 函数声明 是一个相当模糊的术语 这些语言在这方面有很大不同 在C 语言中只有一种函数声
  • javascript、getelementsbyname 和焦点

    我正在尝试创建一个函数 该函数将查看用户名 如果无效 然后向用户发送警报 清除用户名字段 然后将用户名字段重新置于焦点中 我正在尝试使用 getElementsBynName 函数来完成这一切 除了让现场重新成为焦点之外 一切都在进行 我的
  • Theano.function 中“给定”变量的用途

    我正在阅读以下给出的逻辑函数的代码http deeplearning net tutorial logreg html http deeplearning net tutorial logreg html 我对之间的区别感到困惑inputs
  • 如何正确等待浏览器重排/重绘完成

    假设我有一个复杂的 HTML 组件 我想要为其设置动画 但每次需要设置动画时 都需要完成几件事 例如渲染新的 HTML 组件 设置高度 附加 css 类等 如果动画在浏览器重排 重绘过程中触发 这可能会导致动画不平滑 我可以使用 setTm
  • 合并 JSON 对象数组并使用 Javascript 进行排序

    我有一个包含 12 个数组的 JSON 对象 国家不同地区 我正在尝试将此数组合并到选择下拉菜单中 JSON 看起来像这样 latinamerica Argentina Bolivia Brazil Chile Colombia Ecuad
  • 未找到 Laravel 自定义特征

    我对特质很陌生 但我想尝试一下 但是 它似乎没有加载 我在 Laravel 应用程序目录下的文件夹中创建了一个名为 CheckPermsAgainstObjectTrait php 的特征 app Helpers 这是特征代码
  • TypeError:无法读取未定义的属性“map” - 如何访问本地 json API 中的数组

    我能够使用 fetch 在本地导入 api JSON 该 api 可在this http www recipepuppy com apiurl 如果你想查看它 问题如下 当传递状态 searchString 时 出现以下错误 类型错误 无法
  • 在视图中尝试捕获是不好的做法吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 MVC3 应用程序中 在 razor 块内使用 try catch 块是否被认为是不好的做法 in the cshtml view 非常如此
  • 在 Swift 1.1 中重写初始值设定项的正确方法

    这曾经在 Xcode 6 1 beta 中工作 class MainViewController NSViewController convenience override init self init nibName MainView b