当未初始化self时,如何在属性包装器中基于另一个变量创建变量? (SwiftUI)

问题描述 投票:1回答:1

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

无法在属性初始化程序中使用实例成员'名称';属性初始化程序在“自我”可用之前运行。

我尝试为这些变量分配一个临时值,然后在自定义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。谁能告诉我我在做什么错?我是Swift的新手,所以对您有帮助。

swift swiftui self initializer property-wrapper
1个回答
0
投票

要在初始化程序中使用属性包装器,请在变量名前加上下划线。

并且使用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

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

© www.soinside.com 2019 - 2024. All rights reserved.