swift - 当 self 尚未初始化时,如何使用属性包装器中的现有属性? ( swift 用户界面)

标签 swift swiftui self initializer property-wrapper

我有一个在属性包装器内有两个变量的结构。其中一个变量应该是从另一个变量计算出来的。当我尝试执行此操作时,出现以下错误:

Cannot use instance member 'name' within property initializer; property initializers run before 'self' is available.

我尝试为这些变量分配一个临时值,然后在自定义 init() 函数中重新分配它们,但这似乎不起作用。我制作了代码的简化版本,看看是否可以隔离问题。

import SwiftUI

struct Person {
    @State var name: String = ""
    @State var nameTag: NameTag = NameTag(words: "")
    
    init(name: String) {
        // not changing name and nameTag
        self.name = name
        nameTag = NameTag(words: "Hi, my name is \(name).")
    }
}


class NameTag {
    var words: String
    
    init(words: String) {
        self.words = words
    }
}


var me = Person(name: "Myself")
// still set to initial values
me.name
me.nameTag.words

我注意到,当我将 nameTag 更改为 @ObservedObject 而不是 @State 时,它能够正确地重新分配。尽管我不相信我可以将名称更改为 @ObservedObject。谁能告诉我我做错了什么?

最佳答案

要在初始化程序中使用属性包装器,请使用前面带有下划线的变量名称。

对于 State,您可以使用 init(initialValue:) .

struct Person {
  @State var name: String
  @State var nameTag: NameTag

  init(name: String) {
    _name = .init(initialValue: name)
    _nameTag = .init( initialValue: .init(words: name) )
  }
}

这就是 @State 属性的真正样子,因为你可以分解语法糖的级别:

name
_name.wrappedValue
$name.wrappedValue
_name.projectedValue.wrappedValue

不能在初始类型定义之外使用下划线名称。

关于swift - 当 self 尚未初始化时,如何使用属性包装器中的现有属性? ( swift 用户界面),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60981558/

相关文章:

ios - Swift:设置 AVAudioSession 输出音量

ios - SwiftUI 中的 Animate ViewBuilder 内容大小更改

Python 3.5 如何摆脱类函数中的 eval

ios - UIButton addTarget 是如何工作的?

ios - Swift,协议(protocol)和变量值未存储...?

ios - 检测用户点击屏幕 Swift

swift - 创建队列和全局队列的区别。 swift 3

ios - 在 SwiftUI 中调出 Google 登录屏幕

ios - SwiftUI 截断某些字母的文本

ruby - 顶级方法中 `self` 的规则是什么?