gpt4 book ai didi

swift - 将旧的 KVO 转换为 Swift 4

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:08 26 4
gpt4 key购买 nike

我正在尝试将一些旧的 WWDC swift 代码转换为 Swift 4。我认为我已经完成了所有工作,除了最后一点执行一些 KVO。很难将它缩小到最后一点,因为一切似乎都像示例代码一样运行 - 但这些 KVO 方法不会在 Swift 4 中被调用。我在这里找到了:Open Radar Bug

表示以下内容的 Swift 4 方法是什么?

//使用 KVO 机制来表明对“状态”的改变也会影响其他属性

class func keyPathsForValuesAffectingIsReady() -> Set<NSObject> {
return ["state" as NSObject]
}

class func keyPathsForValuesAffectingIsExecuting() -> Set<NSObject> {
return ["state" as NSObject]
}

class func keyPathsForValuesAffectingIsFinished() -> Set<NSObject> {
return ["state" as NSObject]
}

下面是示例中的变量定义:

    override var isReady: Bool {
switch state {

case .initialized:
// If the operation has been cancelled, "isReady" should return true
return isCancelled

case .pending:
// If the operation has been cancelled, "isReady" should return true
guard !isCancelled else {
return true
}

// If super isReady, conditions can be evaluated
if super.isReady {
evaluateConditions()
}

// Until conditions have been evaluated, "isReady" returns false
return false

case .ready:
return super.isReady || isCancelled

default:
return false
}
}

override var isExecuting: Bool {
return state == .executing
}

override var isFinished: Bool {
return state == .finished
}

如果需要更多代码,请告诉我。

如果这是重复问题,请在此处链接到重复问题。我一直找不到解决方案。

最佳答案

  • keyPathsForValuesAffecting…成员可以是属性而不是方法。
  • 必须声明 @objc因为 KVO 系统使用 Objective-C 运行时访问属性。
  • 属性的类型应为 Set<String> .
  • 如果您使用 #keyPath指令,当您使用了无效的键路径(例如,由于拼写错误或属性名称更改)时,编译器会告诉您。

因此:

@objc class var keyPathsForValuesAffectingIsReady: Set<String> {
return [#keyPath(state)]
}

@objc class var keyPathsForValuesAffectingIsExecuting: Set<String> {
return [#keyPath(state)]
}

@objc class var keyPathsForValuesAffectingIsFinished: Set<String> {
return [#keyPath(state)]
}

您还需要确保您的 state属性(property)申报@objc dynamic .

关于swift - 将旧的 KVO 转换为 Swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com