如何使用 Xcode 6.3 Beta2 覆盖 Swift 中超类的 setter?

2024-04-01

我的 SuerClass 是UICollectionViewCell它有一个属性:

var selected: Bool

我的班级是

MyClass : UICollectionViewCell {

  func setSelected(selected: Bool) { 
    super.selected = selected
    // do something
 }

}

前者在 Xcode 6.2 中运行良好,但在 Xcode 6.3Beta2 中会引发错误:

Method 'setSelected' with Objective-C selector 'setSelected:' conflicts with setter for 'selected' from superclass 'UICollectionViewCell' with the same Objective-C selector

如何修复此问题以与 Xcode 6.3 beta2 一起使用?

编辑:我也尝试过:

  override func setSelected(selected: Bool) { 
    super.selected = selected
    // do something
 }

这会导致错误:

方法不会覆盖其超类中的任何方法


如果我们想要它在之后执行一些额外的功能selected属性设置完毕后,我们可以简单地重写以添加属性观察器:

override var selected: Bool {
    didSet {
        if self.selected {
            // do something
        }
    }
}

Swift 5 的更新答案:

override var isSelected: Bool {
    didSet {
        if self.isSelected {
            // do something
        }
    }
}

如果我们关心之前的值是多少selected是,我们可以通过以下方式访问它oldValue:

didSet {
    if self.selected == oldValue {
        return
    }
    // do something
}

Swift 5 的更新答案:

didSet {
    if self.isSelected == oldValue {
        return
    }
    // do something
}

别忘了,我们可以使用willSet如果我们需要在值改变之前做一些事情也是如此。


我很好奇当我们有一个很大的类层次结构时会发生什么,每个类都添加自己的东西willSet and didSet属性观察者,所以我创建了以下测试:

class ClassA {
    var _foo: Int = 0
    var foo: Int {
        set(newValue) {
            println("Class A setting foo")
            self._foo = newValue
        }
        get {
            return self._foo
        }
    }
}

class ClassB: ClassA {
    override var foo: Int {
        willSet {
            println("Class B will set foo")
        }
        didSet {
            println("Class B did set foo")
        }
    }
}

class ClassC: ClassB {
    override var foo: Int {
        willSet {
            println("Class C will set foo")
        }
        didSet {
            println("Class C did set foo")
        }
    }
}

现在,如果我们创建一个对象ClassC并设置其foo财产:

var c: ClassC = ClassC()  
c.foo = 42

我们得到以下输出:

Class C will set foo
Class B will set foo
Class A setting foo
Class B did set foo
Class C did set foo

因此,重要的是要注意一些事情......

  • 一个儿童班的willSet叫做before它的父母的willSet.
  • 一个儿童班的didSet叫做after它的父母的didSet.
  • 为了添加属性观察者而创建覆盖does not替换父类中的所有属性观察器。

前两点有点道理。事实上,这使得房地产观察家更具吸引力。实际上,Swift 迫使我们以适当的方式在层次结构中上下移动,并将其很好地分成两个单独的方法。 Swift 还阻止我们(我相信)覆盖父类的属性,但仍然允许我们观察该属性的更改——这比 Objective-C 的方法要好得多。

但第三点可能是最重要的。小心——你很容易陷入巨大的等级制度之中didSet and willSet代码减慢了本来应该是一个相当快的过程:设置属性的值。

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

如何使用 Xcode 6.3 Beta2 覆盖 Swift 中超类的 setter? 的相关文章

  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • 使用自动布局、IB 和字体大小时表头视图高度错误

    我正在尝试为我的 uiTableView 创建一个标题视图 不是节标题 我已经有了 我已经在界面生成器中设置了一个 XIB 所有的连接都已连接好并且运行良好 除了桌子没有给它足够的空间 我的问题是表格顶部与表格标题有一点重叠 我的 XIB
  • 从父类调用重写的虚拟方法

    假设您正在编写原始 C Object类并且您想要以下功能 object1 object2将比较引用 除非该运算符被覆盖 object1 object2将始终返回对象实际值的倒数object1 object2 所以 举例来说 如果我有一个Bu
  • 如何编辑应用程序包中的文件?

    在我的应用程序中 我从存储在捆绑资源中的 CSV 文件加载数据 但是 我希望能够在用户点击 更新 按钮时以编程方式更新此文件 有没有办法以编程方式更改应用程序包中的资源 这是我用来访问该文件的代码 NSString path NSBundl
  • Apple Developer 应用程序门户不再可以生成新的 Bundle Seed ID

    iOS 开发者门户中的新界面不再为您的应用程序 ID 提供 生成新的 按钮 取而代之的是 使用团队 ID 这将导致使用相同的种子 ID 任何人都知道为什么要进行更改以及您应该如何使用新的捆绑包种子 ID 随意补一些 不再可能生成新的种子 I
  • 在构造函数中调用可重写的方法,例如 Swing 的 add()

    我知道从构造函数调用可重写的方法是一个坏主意 但我也看到到处都是用 Swing 完成的 其中代码如下add new JLabel Something 一直出现在构造函数中 以 NetBeans IDE 为例 它对构造函数中的可重写调用非常挑
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 为arm64或arm7s编译OpenSSL FIPS功能库时出现未知的cpu类型

    我可以成功 至少没有警告并生成 a 文件 针对 arm7 x86 64 和 i386 进行编译 当我编译arm64时 我得到Unknown cpu type 100000c no adjustments made 当我编译arm7s时 我得
  • 命令 /Applications/Xcode-beta.app/Contents/Developer/usr/bin/atool 失败,退出代码 255

    它发生在新的 Xcode7 beta 中 CompileAssetCatalog Users admin Library Developer Xcode DerivedData InstaAd ddgdnbxlpxipirebpndfmgr
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需
  • 使用 ZBarSDK 时 iPhone 相机失去自动对焦功能

    我正在开发一个应用程序 用户可以选择是否要扫描条形码或拍摄某物的照片 为了拍照 我正在使用UIImagePickerController照常 为了扫描条形码 我使用 ZbarSDK 1 2ZBarReaderViewController 拍
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • removeItemAtPath 完成

    我正在以这种方式删除路径上的文件 UIPanGestureRecognizer gesture UIPanGestureRecognizer sender UIButton button UIButton gesture view UIPa
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前
  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • 在 UITableView 的部分标题文本下方添加一些边距

    我已经设计了标题文本的样式 func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath gt UITableViewCell let ce
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview
  • 无需越狱即可检测iOS9上哪个应用程序处于前台

    我正在尝试记录用户在 iOS9 上的个人应用程序使用情况 我宁愿它不会使用越狱有限的解决方案 不言自明 在越狱手机上执行此应用程序的变体应该不难 https www andyibanez com create mobilesubstrate
  • 下载进度条在 iOS 企业发行版中没有改变进度

    我正在通过企业分发开发和分发 iPad 应用程序 它们下载并执行良好 因此一切正常 Web 链接 ipa 文件 plist 文件 配置 问题 是 当用户单击链接进行下载时 iPad 中显示下载进度的进度条显示 正在等待 但却是空的并且永远不

随机推荐

  • EasyMock 中“same”和“eq”的区别

    EasyMock 中的 same 和 eq 之间是否存在显着 甚至任何 差异 same检查两个对象是否实际上是同一个实例 引用相等 eq calls equals因此检查两者是否具有相同的值 值相等 请记住 默认equals实施用途 内部
  • Tensorflow 相当于 numpy.diff

    是否存在相当于的张量流numpy diff https docs scipy org doc numpy reference generated numpy diff html 计算沿给定轴的第 n 个离散差值 对于我的项目 我只需要 n
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 在 Android 中使用签名 URL 从 Amazon S3 + CloudFront 播放 m3u8

    我能够使用签名 URL 访问播放列表文件 m3u8 但问题是 要访问播放列表中的流文件 ts 每个文件的 URL 也需要签名 例如 我可以使用签名 URL 访问 playlist m3u8 EXTM3U EXT X TARGETDURATI
  • 在模态 JDialog 之外时光标不正确?

    使用方法时setCursor 要更改组件使用的光标 所有组件都可以正常工作 包括JFrame and JDialog 这里的问题在于modal JDialog 当鼠标处于inside对话框中 光标显示在右侧 但是 当鼠标移动时outside
  • 使用 AngularJS 和 ngResource 调用外部 api

    我们目前正在开发一个小型 AngularJS 项目 并从前端开始 所以纯 HTML 和 JavaScript 然而 我们需要使用 ngResource 进行一些 API 调用 目前我们正在使用canned http github com s
  • 将 Google Apps API 密钥与距离矩阵结合使用

    我正在使用谷歌距离矩阵 API https developers google com maps documentation distancematrix 并且文档告诉我我需要一个 API 密钥 但我可以在没有 API 密钥的情况下使用它
  • 当 AngularJS 中的响应为 304(未修改)时,$http 返回错误

    我正在使用 angularjs http 向 asp net web api 发出请求 服务器上的 Web API 通过 ETag 管理缓存 如果我的响应状态代码是 304 那么它会进入错误函数 而不是成功函数 我不明白 AngularJS
  • 在 DataGrid 工具栏的弹出组件 Material-UI 中添加自定义样式

    我正在创建一个自定义Data Grid Toolbar通过修改现有组件Grid Toolbar组件来自材质 UI https v4 mui com Here https v4 mui com components data grid fil
  • WWW::Mechanize::Timed https 超时不起作用

    所以我在互联网上研究了这个问题 至少我是这么认为的 我正在尝试设置一个alarm超时 60 秒get 但它不会被捕获 并且会运行超过 60 秒 而且每当 www mechanized timed 构造函数达到默认超时 180 秒 时 我都会
  • Discord.py 机器人没有响应

    我对discord py相对较新 我正在制作一个机器人 但是使用某些命令或我放置的东西 机器人停止响应命令 当它以前工作时 我不知道如何修复它 机器人开启 但不响应任何命令 这是新的区域 import os import discord f
  • C#列表覆盖问题[重复]

    这个问题在这里已经有答案了 我有一些代码如下所示 用于写入 a 的值gridview到如图所示的列表 该代码确实获得了正确的值 但是当网格的第二行添加到列表中时 它会覆盖列表的第一行 有人知道为什么会发生这种情况吗 C Code List
  • 如何在 SQL 中识别连续日期组?

    我正在尝试编写一个函数来识别日期组并测量该组的大小 到目前为止 我一直在 Python 中按程序执行此操作 但我想将其移至 SQL 中 例如 列表 Bill 01 01 2011 Bill 02 01 2011 Bill 03 01 201
  • 角度标记错误

    我突然得到这个 它不允许我正确使用我的传单地图 每次我单击地图时 都会将一个标记添加到相同的坐标 当我尝试使用函数删除标记时 它会清空标记数组 但标记在地图上仍然可见 这是怎么回事 Error parse syntax Syntax Err
  • Django 预关闭钩子关闭挂起的 pymongo 连接

    我在 Django 项目中使用 pymongo 最近我开始遇到一个问题 在退出主 Django 进程 即使通过管理命令 时 pymongo 连接将挂起 并且该进程永远不会退出 显然 堆栈中的某个地方出了问题 但目前最好的解决方案似乎是在 D
  • @UsePipes(ValidationPipe) 不适用于泛型(抽象控制器)

    我正在使用构建 APINest js和MySQL 由于敏捷性和 DRY 原则 我正在创建一个 OOP 结构 它为给定实体 来自 TypeORM 设置所有基本 CRUD 端点 主要目标是避免为不同的实体编写相同的通用方法 为了实现这一目标 我
  • 有没有办法在 VAR 模型中挑选滞后变量?

    我对每日数据的两个时间序列进行建模 一是注册 二是订阅的终止 我想使用 VAR 模型的两个变量中包含的信息来预测后者varsR 中的包 由于我正在对订阅进行建模 因此我知道终止与前几个月的注册倍数相关 也就是说 5 月 10 日的注册人数激
  • document.execCommand() FontSize(以像素为单位)?

    如何使用以下命令将字体大小更改为 30px 例如 document execCommand This document execCommand fontSize false 30px 不起作用 因为在函数 execCommand 的第三个参
  • 在 Java 中执行身份验证加密的正确方法是什么?

    验证加密要求我们使用一些公认的标准来加密和验证消息 因此 我们对消息进行加密并计算消息的 MAC 以验证它没有被篡改 这个问题 https stackoverflow com questions 992019 java 256 bit ae
  • 如何使用 Xcode 6.3 Beta2 覆盖 Swift 中超类的 setter?

    我的 SuerClass 是UICollectionViewCell它有一个属性 var selected Bool 我的班级是 MyClass UICollectionViewCell func setSelected selected