如何在 Swift 中使用 Self 作为方法返回类型?

2023-11-30

这段代码会产生 Xcode 错误消息,让您陷入困境。假设我有一个名为Marker我希望标记能够复制自己。这是第一个猜测......

protocol Marker {
    func copy() -> Self
}
class Marker1 : Marker {
    func copy() -> Self {
        return Marker1()   // error here
    }
}

(我不知道如何使用Self正确,因为我在Swift 编程语言文档。如果您知道记录在哪里,请在答案中包含该内容。)

该代码在标记行上给出了错误:Cannot convert return expression of type 'Marker1' to return type 'Self'它建议修复:Insert ' as! Self'.

我接受修复:

...
    return Marker1() as! Self
...

这会导致另一个编译器错误:'Self' is only available in a protocol or as the result of a method in a class; did you mean 'Marker1'?

如果我接受“修复”,它将返回到原始错误。我将其称为 Xcode 中的错误。让我们尝试一下其他的东西:

func copy() -> Marker1 {
    return Marker1()
}

另一个错误:Method 'copy()' in non-final class 'Marker1' must return `Self` to conform to protocol 'Marker'

上课final确实修复了错误。但有没有办法在不进行期末考试的情况下做到这一点呢?以及在哪里Self有记录吗?


对于这样的层次结构,您必须使类符合协议final:

protocol Marker {
    func copy() -> Self
}
final class Marker1 : Marker {
    func copy() -> Marker1 {
        return Marker1()
    }
}

The final是需要的,因为当你不申请时final然后你创建一个子类Marker2: Marker1那么复制将不会返回正确的类Self不再有。

您可以通过创建一个来解决这个问题required初始化程序并始终创建正确的实例:

protocol Marker {
    init()
    func copy() -> Self
}
class Marker1 : Marker {
    required init() {
    }
    func copy() -> Self {
        let copy = type(of: self).init()
        return copy
    }
}

(原代码因不起作用而被删除)

有关的:在 Swift 中实现 copy()

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

如何在 Swift 中使用 Self 作为方法返回类型? 的相关文章

随机推荐

  • 是否可以使用 Streams.intRange 函数?

    我想使用 Streams intRange int start int end int step 来实现反向排序流 然而 似乎 java util Streams 类不再可用 但它仍然在标准库的 rt jar 中 该方法是否在其他类中或被其
  • 修改ggplot中的viridis调色板

    我试图通过一个主要是数字的因素来为 ggplot 着色 如下所示 iris gt ggplot aes Sepal Length Sepal Width color cut Petal Length 0 7 geom point scale
  • Angular 2 共享服务将数据传递到组件

    我正在尝试传递字符串值this title从我的登陆页面 组件到我的结果页面 组件 我检索到list show值 并将其发送到我的TitleService就像我的 登陆页面 component html ol li list show li
  • 正则表达式仅匹配整个单词中的数字

    我想使用 NET 匹配字符串内的正数和负数 无小数或千位分隔符 但我只想匹配整个单词 所以如果一个字符串看起来像 redeem 1234 paid 234432 那么我想匹配 1234 和 234432 但如果文本是 LS022 1234
  • VB.NET 中的 HTTP GET

    在 VB net 中发出 http get 的最佳方法是什么 我想得到像这样的请求的结果http api hostip info ip 68 180 206 184 在 VB NET 中 Dim webClient As New Syste
  • 使用 youtube API v3 时订单不起作用

    我正在尝试获取某个频道的最后 10 个视频 当我运行以下代码时 from apiclient discovery import build API SERVICE NAME youtube API VERSION v3 def youtub
  • “警告:在参数列表中声明了‘结构矩阵’[默认启用]”和错误:‘scanToken’的类型冲突

    我一直在研究这个问题 试图找出导致这些错误的原因 但到目前为止我一无所获 我有这个功能 struct token scanToken struct matrix refTable struct token send int counter
  • 如何自动重新启动 CSS 动画

    我是网页设计新手 在 CSS 方面面临一些问题 其实我是在克隆amazon com并创建一个带有滑动动画的滑块 但动画只运行一次 我想让它无限运行 这是我的代码 HTML index html
  • 请推荐最佳的批量删除选项

    我正在使用 PostgreSQL 8 1 4 我有 3 个表 一个是核心表 表 1 其他是从属表 表 2 表 3 我在表1中插入了70000条记录 并在其他2个表中插入了适当的相关记录 由于我使用了 CASCADE 我可以使用 DELETE
  • 卡住创建“安全修剪”html.ActionLink 扩展方法

    我正在尝试为 MVC 的 htmlHelper 创建一个扩展方法 目的是根据控制器 操作上设置的 AuthorizeAttribute 启用或禁用 ActionLink 借自MVC站点地 图在 Maarten Balliauw 创建的代码中
  • 如何更改谷歌地图 v2 android 中的信息窗口(自定义)位置?

    我有一个带有谷歌地图的屏幕 在屏幕顶部有一个用于搜索位置的自动文本视图 并制作一个自定义信息窗口来显示更多详细信息 问题是当用户单击任何标记自定义窗口弹出窗口作为其默认行为时 屏幕中心 所以它混合了自动文本视图 我可以更改屏幕上的信息窗口位
  • 如何将 UIButton 的标题设置为左对齐?

    我需要在左侧显示电子邮件地址UIButton 但它被定位到中心 有什么办法可以将对齐方式设置为左侧UIButton 这是我当前的代码 UIButton emailBtn UIButton alloc initWithFrame CGRect
  • 如何将资源添加到jar文件中

    我需要将一个 exel 文件添加到我的 jar 中 以便它是可移植的 我知道答案是使用 getClass getResource 但我不知道如何使用此代码 我的 src 文件夹中有 excel 文件和我的类文件 它可以在 netbeans
  • T[N] 和 std::array 之间的区别[重复]

    这个问题在这里已经有答案了 我的问题非常简单 但更具体地说 我想引用其中的两行斯特鲁斯特鲁普11 T N 固定大小的内置数组 N 个连续的 T 类型元素 不size 或其他成员函数 array
  • 使用 spacy 从数据框中提取实体

    I read contents from excel file using pandas import pandas as pd df pd read excel FAM template Update 1911274 JS xlsx df
  • 将参数传递到 setTimeout 的闭包中

    我遇到了一个问题 我的应用程序位于 iframe 中 并且是从外部域调用的 当 iframe 正确加载时 IE9 不会触发加载事件 所以我认为我陷入了使用 setTimeout 来轮询页面的困境 不管怎样 我想看看我的 setTimeout
  • 为什么我的 srand(time(NULL)) 函数在 c 中每次都会生成相同的数字? [复制]

    这个问题在这里已经有答案了 所以我正在创建一个程序 它会调用一个函数并返回 0 或 1 0 表示反面 1 表示正面 然后用它来打印 100 次翻转的结果 我认为我可以使用 srand time NULL 来为 rand 提供不断变化的种子
  • 使用 JavaScript 查找特定链接

    任何人都可以帮助我使用 JavaScript 函数来搜索源代码并将网站上的所有链接与我正在寻找的特定链接进行比较 例如 我正在执行 JavaScriptwww youtube com我正在寻找一个特定的 YouTube 链接 它可能看起来像
  • 如何将 sql server 2008 R2 与 windows store 应用程序连接

    我目前正在开发一个 Windows 商店应用程序 我需要将我的应用程序与 sql server 2008 R2 Db 连接 一些 sql 类无法在 WinRT API 中工作 请任何人对此提出建议并告诉我可以使用哪个 RDBMS 来连接和
  • 如何在 Swift 中使用 Self 作为方法返回类型?

    这段代码会产生 Xcode 错误消息 让您陷入困境 假设我有一个名为Marker我希望标记能够复制自己 这是第一个猜测 protocol Marker func copy gt Self class Marker1 Marker func