Swift:在类中实现协议初始化器

2023-11-29

我试图理解为什么 Swift 强制执行一个符合协议的类,并根据需要将初始化程序标记为。这本质上强制所有子类也实现该初始值设定项。指定的超类初始值设定项肯定会被继承吗?

下面的引述摘自《Swift 语言指南》:https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID272

您可以在符合要求的协议上实现协议初始值设定项要求 类作为指定初始值设定项或便利初始值设定项。 在这两种情况下,您必须使用以下标记初始化程序实现 所需修饰符:

class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        // initializer implementation goes here
    }
}

class SomeSubclass: SomeClass {
    required init(someParameter: Int) { // enforced to implement init again
        // initializer implementation goes here
    }
}

使用 required 修饰符可确保您提供显式的 或继承所有初始化器要求的实现 符合类的子类,这样它们也符合 协议。

EDIT:我最初并没有提到我目前仅限于 Swift 2.1。这似乎是此版本中的编译器问题,在更高版本中不会出现。


指定的超类初始值设定项肯定会被继承吗?

不,并非总是如此。如果子类定义了自己的指定初始化器,那么它不会自动继承超类的指定初始化器。考虑以下示例:

class Foo {
    init() {}
}

class Bar : Foo {

    var str: String

    init(str: String) {
        self.str = str
    }
}

let b = Bar() // illegal – what value would the 'str' property have?

As Bar定义了自己的init(str:)指定的初始化器,它不会自动继承Foo的指定初始值设定项init()。这可以防止在子类声明其自己的存储属性的情况下进行不安全的初始化。

Marking init() as required enforces Bar has an init(),通过提供自己的实现:

class Foo {
    required init() {}
}

class Bar : Foo {

    var str: String

    init(str: String) {
        self.str = str
    }

    // implement required init(), as Bar defines its own designated initialiser.
    required init() {
        self.str = "foo" // now str is correctly initialised when calling init()
    }
}

let b = Bar() // now legal

或者通过继承Foo的实现(当Bar没有定义自己的指定初始化器):

class Foo {
    required init() {}
}

class Bar : Foo {
    // inherits init() from Foo, as Bar doesn't define its own designed initialisers.
}

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

Swift:在类中实现协议初始化器 的相关文章

  • Swift 中的运行时错误处理

    我完全知道 Swift 没有 try catch 机制来捕获异常 好吧 Swift 2 0 现在支持它们 我还了解到 许多 API 方法都会返回一个 NSError 如果出现问题 该错误对象将被填充为错误对象 所以请不要向我指出这个问题 S
  • Swift 类型推断和类型检查问题

    我不是在寻找如何正确执行此操作的答案 而是在寻找为什么会发生这种情况的答案 这是代码 func isInt param AnyObject if let value param as Int print value else print N
  • 使用 swift 准备 ForSegue 集合查看索引路径

    我没有找到任何好的例子来使用 swift 做我想做的事情 所以我允许自己问这个问题 我使用 collectionView 来显示 PFObjects 我想使用prepareForSegue 将显示的单元格数据发送到第二个控制器 此时 我正在
  • 取消所有操作+AFNetworking 3.0

    我创建了一个继承自 AFURLSessionManager 的 HTTPServiceProvider 类 添加以下代码来获取数据 let configuration NSURLSessionConfiguration defaultSes
  • UIDocumentInteractionController 显示空白 pdf

    我尝试使用 UIDocumentInteractionController PresentPreviewAnimated 方法在 iOS 设备上显示 pdf 但它一直显示空白文档 我认为这可能与字符编码有关 但我不确定 如果我使用 UIWe
  • 为什么 Obj-C 属性默认所有权“分配”而不是“强”

    我正在向旧项目添加 Swift 类 一切进展顺利 直到我尝试向 Swift 类添加属性 生成的标头无法编译 我认为问题是 在生成的代码中 Swift 省略了strong所有权并仅将其声明为nonatomic 这通常应该足够了 因为 prop
  • 使用Table Per Subclass时如何确保数据完整性?

    我正在使用每个子类的表Grails 中的策略通过设置tablePerHierarchy静态的性质mapping我的超类中的字段为 false 这样 Grails 会为我的超类创建一张表 并为我的每个子类创建一张附加表 然而 虽然超类和子类记
  • 如何将渐变应用于 iOS Swift 应用程序的背景视图

    我正在尝试应用渐变作为视图 故事板的主视图 的背景颜色 代码运行 但没有任何变化 我正在使用 xCode Beta 2 和 Swift 这是代码 class Colors let colorTop UIColor red 192 0 255
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • CLLocation Manager如何在一定距离后更新

    我正在使用 CLLocationManager didupdatelocations 如下所示 func locationManager manager CLLocationManager didUpdateLocations locati
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的
  • SwiftUI 列表与右侧的部分索引?

    是否可以有一个在右侧有索引的列表 就像下面 SwiftUI 中的示例一样 我在 SwiftUI 中做了这个 Contacts swift TestCalendar Created by Christopher Riner on 9 11 2
  • C# 中的类和基类继承

    我有一个 C 类 如下所示 public class BarChart public BarData BarChartData public BarStyle BarChartStyle public BarChart BarData da
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • 从“NSPercientStoreResult”转换为不相关类型“Entity”总是失败

    我正在创建一个小应用程序来学习 CoreData 中的多对多关系 但是 使用下面的代码 从 NSFetchResult 到实体类 Groepering 的转换出现错误 与我的项目相比 我在互联网上找到的示例没有看到任何差异 为什么转换仍然失
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s

随机推荐

  • Lambda 上的木偶师

    我想用puppeteer在 Lambda 上将 HTML 转换为 PDF 随着chrome aws lambda模块或puppeteer模块 我正在尝试运行 sam local invoke 一个调用的函数puppeteer launch
  • 5 月 1 日后弃用后,offline_access 将如何工作?

    我做了一些测试 发现结果与 Facebook 的文档相矛盾 https developers facebook com roadmap offline access removal 如果我们启用 弃用离线访问 并在移动客户端请求离线访问 我
  • Android Gradle 插件需要 Java 11 才能运行。您当前使用的是 Java 1.8。 **EXPO.dev**

    我正在尝试使用该命令eas build p android构建我的安卓 aab文件 但每次我尝试这样做时 我都会发现错误 Android build failed Gradle build failed with unknown error
  • 如何在 Python 中将参数方程拟合到数据点

    我正在寻找一种适合的方式参数方程使用 Python 生成一组数据点 作为一个简单的例子 给出了以下数据点集 import numpy as np x data np array 1 2 3 4 5 y data np array 2 0 3
  • 是否可以在 Cassandra 中以 CQL blob 类型存储 PDF 文件?

    以避免有关问题 为什么使用 cassandra 而选择其他数据库 我们必须这样做 因为我们的客户决定我的选择是一个完全错误的决定 在我们的应用程序中 我们必须处理 PDF 文档 即阅读它们并用数据填充它们 所以我的目的是将文档 模板 保存在
  • 在 C# 中使用数字设置颜色

    我可以使用画笔设置对象的颜色 如下所示 Brushes Red 如何使用数字应用相同的方法 say SetColor ffffff 上面是一个想象的例子 您可以使用ColorTranslator FromHtml 编辑 为了回应您的评论 您
  • Asyncio 与另一个协程同时运行 Dash (Flask) 服务器

    我创建了一个 dash 应用程序来显示另一个代码正在收集的信息 我想使用 Python 中的 asyncio 模块同时运行它们 我的代码使用异步函数 而 Dash 应用程序 基于 Flask 在服务时阻止其他任何内容执行 我不确定这是否需要
  • 如何使用 gl.lineWidth()

    其他一切都进展顺利 界限正在绘制中 它似乎只是忽略了 gl lineWidth 调用 我还有什么需要做的吗 gl lineWidth 17 gl drawArrays this drawMode 0 totalVertices 我是否有可能
  • Javascript RegExp 在具有嵌套子字符串的字符串上应用跨度标签

    示例字符串 There is a red car parked in front of a blue house with a fence painted red 要使用跨度突出显示的字符串是 red car blue house red
  • 每当在Linux中使用inode创建新文件时,如何获取文件名以及文件的绝对路径?

    我用我的linux操作系统 CentOS 做了一些实验 我想跟踪在同一环境下创建的所有工具日志 工具生成相应的日志 log extn 来跟踪这些更改我编写了一个perl观察程序 它实际上监视目录我设置的 当创建新文件时 它将显示在输出中 但
  • 这两种函数语法类型有什么区别[重复]

    这个问题在这里已经有答案了 正如标题所说 两者有什么区别 MyFunction function and function MyFunction Nothing 复制 var functionName function vs functio
  • 如何根据其他字段值更改 OpenERP 选择字段中的选择?

    我有一个包含四个字段的表单 作物 选择 活动起始日期 至今活跃 区块区域 选择 如何使块区域中的可用选项取决于用户为其他字段选择的值 我不知道是否可以使用选择字段来完成此操作 但是当另一个字段更改值时 您可以更改多对一字段的域 您也许还可以
  • 这是有效的 YAML 吗?

    所以对于我在 C 中的文本解析question 我被定向到 YAML 我在推荐这个库时遇到了困难 所以这是一个快速的方法 heading name A name taco Yes age 32 heading name Another na
  • 意外的命名空间“map” - Android Google Maps API

    这是我的 XML 文件的全部内容 重要的部分是最后的地图片段 它给了我这个错误 标签片段发现意外的命名空间前缀 它似乎不会影响代码 但我很好奇是否有人知道发生了什么 我看过帖子说这是 Lint 问题或 Eclipse 问题 但我使用的是最新
  • (*(int (*)())a)() 是什么意思?

    我是学习C 的初学者 今天看到一个这样的指针函数 int a 我很困惑这是什么意思以及如何轻松理解它 让我们添加一个 typedef 以帮助弄清楚它的正面或反面 typedef int int func ptr int func ptr a
  • JTextPane 和 JTextField 之间的文本选择冲突

    如果存在 JTextField 为什么无法以编程方式选择 JTextPane 中的文本 我认为与专注有关 谢谢 import java awt FlowLayout import java awt GridLayout import jav
  • 从时间选择器中选择时间获取不同时区的时间

    我遇到将选定的小时和分钟转换为国家 地区不同时区的问题 假设如果我选择印度上午 10 点 那么我想知道印度上午 10 点美国 纽约和东京的时间 反之亦然 任何帮助都是值得赞赏的 谢谢 请找到以下解决方案 SimpleDateFormat s
  • 如何将复杂矩阵保存在文件中?

    我必须使用 numpy 的 savetxt 命令将下面显示的包含复杂数据的矩阵保存到扩展名为 H 的文件中 但我无法保存它 要保存的矩阵是 1 0 0 j 0 0 0 j 0 0 0 j 1 0 0 j 1 0 0 j 0 0 0 j 2
  • 如何在球衣资源方法中重写@JsonView

    我有一些使用 JsonView 注释设置的球衣资源方法 以便过滤响应中返回的字段 我希望在某些情况下能够用另一个注释中设置的 JsonView 覆盖 或者有时完全禁用它 某些 queryParam 将用于定义应设置哪个视图进行渲染或是否应禁
  • Swift:在类中实现协议初始化器

    我试图理解为什么 Swift 强制执行一个符合协议的类 并根据需要将初始化程序标记为 这本质上强制所有子类也实现该初始值设定项 指定的超类初始值设定项肯定会被继承吗 下面的引述摘自 Swift 语言指南 https developer ap