如何覆盖SWIFT中存储属性的设置器?

在Obj-C中,我可以覆盖其setter,但Swift似乎对将getter/setter用于存储属性并不满意.

假设我有一个Card类,它有一个名为rank的属性.我不希望客户机给它任何无效值,因此,在Objective-C中,我可以覆盖setRank,以便它执行额外的判断.但是SWIFT中的willSet似乎没有帮助,因为newValue是常量,赋值rank没有意义,因为setter将在循环中调用.

推荐答案

好的.阅读有关SWIFT的苹果文档时,我发现有this个:

如果为其自身didSet观察器中的属性赋值, 您分配的新值将替换刚刚设置的值.

所以你要做的就是:

var rank: Int = 0 {
    didSet {
        // Say 1000 is not good for you and 999 is the maximum you want to be stored there
        if rank >= 1000  {
            rank = 999
        }
    }
}

Ios相关问答推荐

如何在iOS 17中拦截UITextView中的链接点击?UITextItemInteraction已弃用

在TVOS中访问SWIFT中的objc++函数时发送给类的无法识别的 Select 符

在视图上执行手势会阻止相机操作

Flutter 翼项目.升级到XCode 15.0.1`pod install`抛出错误FlutterMacOS.podspec.json 3.13.2的ParserError

Xcode 15阻止我的应用程序运行:由于实时模式录制的高比率,丢失了1条日志(log)/路标消息?

如何删除NavigationView中的默认透明标头?

为什么applicationState发布者只发布一次?

如何链式设置 AttributeContainer 的 UIKit 属性?

Swift中是否有一种方法可以为可选属性创建一个计算(computed)属性

如何在 SwiftUI 中创建显示当前电池电量的电池徽章

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

如何识别 SwiftUI 中点击的按钮 ID 以使该按钮动画化?

使用 RxDatasources 作为数据源时如何填充自定义页眉/页脚视图

iOS 8 - 使用自定义演示关闭视图控制器后屏幕空白

每次运行后,Xcode 6 都会在 iOS8 模拟器中重命名我的应用程序目录.

Xcode 6 App Store 提交失败并显示您的帐户已经拥有有效的 iOS 分发证书

在 iOS 编程中使用 Storyboard 代替 xib 文件有什么好处?

在 iOS 中获取设备位置(仅限国家/地区)

当键盘出现在 iOS 中时,将 UIView 上移

如何在ios中生成UUID