swift - 为什么 Swift 中的赋值不会发生?

标签 swift generics protocols variable-assignment compiler-bug

在下面的 Swift 代码中,对于某些类型 T:HasDefaultValuesinit(variableValue: T) 中的赋值不会发生,成员 variableT.defaultValue 的值:

protocol HasDefaultValues : Equatable {
  static var defaultValue: Self {get}
  static var alternativeValue: Self {get}
}

class MyClass<T:HasDefaultValues> : NSObject, NSCoding {
  var variable: T = T.defaultValue

  init(variableValue: T) {
    self.variable = variableValue // Executed, but assignment doesn't happen!
    super.init()
  }

// ... More code follows
}

我已经使用调试器单步执行了代码,并确认 variableValue 的值符合预期,执行通过了 self.variable = variableValue 赋值,但 self.variable 的值不会改变。对于许多其他类型 T:HasDefaultValues,该代码按预期工作。这可能是编译器错误?

T:HasDefaultValues 类型的代码没有发生赋值是相当复杂的,我没有尝试将事情减少到最小的可重现示例。我在这里问除了编译器错误之外,是否有充分的理由让简单的赋值失败。如果有,这将有助于将事情减少到最小的可重现示例。

提前致谢。

最佳答案

我认为一些代码再次改变了 variable 属性。

请加一个观察者来验证这个“理论”。

var variable: T = T.defaultValue {
    didSet(oldValue) {
        debugPrint("variable changed from \(oldValue) to \(variable)")
    }
}

关于swift - 为什么 Swift 中的赋值不会发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34925308/

相关文章:

ios - SFSpeechRecognizer在IOS 13.2中无法正常工作

macos - Xamarin Macintosh 客户 URL 协议(protocol)句柄传递的参数

ios - 创建一个表示可以打开或关闭的可散列对象的协议(protocol)

java - 关于自己协议(protocol)的设计/实现的技巧

ios - 在返回导航中从单元格中删除观察者

ios - 表 TableView 中的字母部分

ios - "Zero out"Swift 中的敏感字符串数据

java - Consumer<T> 映射到 HashMap 中的 Class<T>

android - 如何在 Dart/Flutter 中泛化可选参数

java - 如何使用泛型类型实现接口(interface)?