Swift 中“self”的用途是什么?

2023-12-12

我是 Swift 新手,我想知道什么self用于以及为什么。

我在类和结构中看到过它,但我真的不认为它们是必要的,甚至没有必要在我的代码中提及它们。它们的用途是什么?为什么?什么情况下需要使用它?

我已经阅读了很多关于这个问题的问题和答案,但没有一个完全回答我的问题,而且他们总是倾向于将其与this就像Java一样,我对它一点也不熟悉。


是的,它是一样的this在爪哇和self在 Objective-C 中,但在 Swift 中,self仅当您从闭包调用属性或方法或区分代码内的属性名称(例如初始值设定项)时才需要。因此,您可以安全地使用几乎所有类组件,而无需使用self除非你是从闭包中调用的。

“self 属性 类型的每个实例都有一个隐式属性 被称为self,它与实例本身完全相同。你 使用self属性来引用其内的当前实例 自己的实例方法。

The increment()上面例子中的方法可以写成 像这样:

func increment() {
    self.count += 1
}

实际上,你不需要写self经常在你的代码中。 如果你没有明确写出self,斯威夫特假设你是 每当您引用当前实例的属性或方法时 在方法中使用已知的属性或方法名称。这个假设 是通过使用来证明的count(而不是self.count) 在 Counter 的三个实例方法中。

当参数名称为 实例方法与该实例的属性具有相同的名称。在 这种情况,参数名优先,就变成了 有必要以更合格的方式引用该属性。你用 这self属性来区分参数名称和 属性名称。

Here, self消除称为方法参数之间的歧义x和 一个实例属性,也称为x:”

摘自:Apple Inc.“Swift 编程语言(Swift 2 预发行版)”。


就是这样雷·温德利希建议使用self在 Swift 中查看他们的教程:

使用自我

为了简洁,避免使用self因为 Swift 不要求它访问对象的属性或调用其方法。

Use self当需要区分初始值设定项中的属性名称和参数时,以及根据编译器的要求在闭包表达式中引用属性时:

class BoardLocation {
  let row: Int, column: Int

  init(row: Int, column: Int) {
    self.row = row
    self.column = column

    let closure = {
      println(self.row)
    }
  }
}

这是GitHub的建议self对于他们的应用:

仅明确提及self在需要的时候

当访问属性或方法时self,留下参考self默认情况下隐式:

private class History {
    var events: [Event]

    func rewrite() {
        events = []
    }
}

仅在语言需要时才包含显式关键字 - 例如,在闭包中或当参数名称冲突时:

extension History {
    init(events: [Event]) {
        self.events = events
    }

    var whenVictorious: () -> () {
        return {
            self.rewrite()
        }
    }
}

理由:这使得 self 的捕获语义在闭包中更加突出,并避免了其他地方的冗长。

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

Swift 中“self”的用途是什么? 的相关文章

  • Swift 错误:无法从 AST 上下文获取模块“My_App”

    我正在使用 Swift 3 Xcode 8 1 CocoaPods 1 1 1 运行后pod update 每次我尝试使用 Xcode 的 lldb 控制台时 它都会打印错误 例如 po self输出 共享 Swift 状态My App已出
  • 动态高度 UITableViewCell 内的动态高度 UICollectionView

    我有一个水平的UICollectionView固定到 a 的所有边缘UITableViewCell 集合视图中的项目是动态调整大小的 我想让表视图的高度等于最高集合视图单元格的高度 视图的结构如下 UI表格视图 UITableViewCel
  • UIView 框架更改时阴影层不调整大小

    问题图像截图 https i stack imgur com cyc5o png class ViewController UIViewController var shadow UIView override func viewDidLo
  • 应用程序更新后 PFUser currentUser nil

    我已经在 App Store 中更新了我的 iOS 应用程序 对于安装更新的用户来说似乎存在一个错误 他们的PFUser currentUser正在返回nil 知道为什么会发生这种情况吗 要添加信息 我在我的应用程序中使用此代码启用自动用户
  • 在 Swift 中将 gif 保存到 iOS 照片库

    我正在尝试保存位于已使用 Regift 代码创建的临时文件中的 GIF 图像 Regift https github com matthewpalmer Regift https github com matthewpalmer Regif
  • Cocoapods 测试链接器错误

    每当我构建测试目标 Xcode 生成的标准目标 时 构建都会失败并出现神秘错误 framework not found Pods AppName AppNameTests 我认为这意味着无法找到为我的测试生成的 pod 目标 我的 podf
  • 检测用户何时清除通知中心的通知

    我的应用程序需要知道用户是否使用清除按钮从通知中心删除 清除应用程序通知 是否可以检测用户何时从通知中心删除通知或抓取通知中心上的一组通知 你 即App 无法与NotificationCenter交互 NotificationCenter与
  • 具有自签名证书的 Alamofire / ServerTrustPolicy

    我想使用 Alamofire 通过带有自签名证书的 https 连接与我的服务器进行通信 我的环境在本地主机上运行 我尝试连接 但响应始终如下所示 Success false Response String nil 我用下面的代码完成了它
  • 在应用程序中全局关闭自动更正

    我想在 iPad 应用程序中禁用文本输入自动更正 无论设备上自动更正的全局设置是什么 有没有一种好的方法可以通过 API 执行此操作 或者我只需要浏览整个应用程序 找到所有文本输入字段 然后单独关闭每个字段的选项 抱歉 您必须检查所有文本字
  • Swift - 必须由子类覆盖的类方法

    是否有一种标准方法可以在 Swift 中创建 纯虚函数 即 一个must被每个子类覆盖 如果不是 会导致编译时错误 您有两个选择 1 使用协议 将超类定义为协议而不是类 Pro 编译时检查每个 子类 不是实际的子类 是否实现了所需的方法 C
  • 通过 iBeacon 监控和测距与 CoreBluetooth scanForPeripheralsWithServices 检测信标

    对于 iOS 对想要扫描 BLE 信标 外设的应用程序施加的限制 存在很多困惑 在阅读了几个博客和 Stack Overflow 答案后 我想看看我是否正确理解了所有问题 如果有什么理解错误或者遗漏的地方请指正 我仅指 iOS 7 及更高版
  • 在 UICollectionView 下面插入子视图

    当我在 UICollectionView 下方添加子视图时 有时子视图会显示在 UICollectionView 单元格上方 这是子视图插入代码 self collectionView insertSubview self garmentV
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • 使用 iOS swift AVPlayer 在横向模式下不全屏

    我将视频视图设置为全屏 然而 在模拟器中玩时 它并没有全屏运行 此问题仅适用于 iPad 不适用于 iPhone 这是我的代码 override func viewDidAppear animated Bool super viewDidA
  • 领域数据库对象看起来是空的,但实际上不是

    我在用Realm https realm io对于一个小而简单的项目 我正在使用最新版本的框架 昨天从 Github 编译 和当前 AppStore 版本的 Xcode with Swift 2 1 我正在通过 segue 将 Realm
  • Firebase Analytics DebugView 收集的事件数据不完整

    我正在将事件发送到 Firebase Analytics 并发现 DebugView 中缺少部分事件参数 下面是发送到 Firebase 的两个相同事件 我检查了 Xcode 调试控制台中是否存在所有参数 缺失的参数似乎是随机的 有时根本没
  • 自定义 OpenVPN iOS 客户端 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个自定义 iOS OpenVPN 客户端 我找到了这个原生 OpenVPN 客户端核心源码https staging op
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某
  • Swift - 在 TableView 单元格中使用步进器递增标签

    这里又是一个 Swift 初学者 我只是想在每个 TableView 单元格中使用一个步进器来增加同一单元格中的标签 我发现了关于这个主题的几个问题 但它们包含其他元素 我无法提取基本概念 Swift Stepper Action 更改同一

随机推荐