在self尚未初始化时如何使用属性 Package 中的现有属性?(SwiftUI)

hyrbngr7  于 2023-03-07  发布在  Swift
关注(0)|答案(2)|浏览(205)

我有一个在属性 Package 器中有两个变量的结构体。其中一个变量应该是从另一个变量计算出来的。当我尝试这样做时,我得到了以下错误:
不能在属性初始值设定项内使用示例成员“name”;属性初始值设定项在“self”可用之前运行。
我试着给这些变量分配一个临时值,然后在一个自定义的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时,它能够被正确地重新分配。尽管我不相信我可以将name更改为@ObservedObject。有人能告诉我我做错了什么吗?

dtcbnfnu

dtcbnfnu1#

要在初始化器中使用属性 Package 器,请使用前面带有下划线的变量名。
对于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

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

lp0sw83n

lp0sw83n2#

当你为旧操作系统iPhone构建应用程序时,也会发生这种情况,因为苹果不提供更新,因为这些东西已经过时。

if #available(iOS 16.0, *) {

 } else {
     // Fallback on earlier versions
 }

显示此警告的每一行。注:不要在类或结构体的开头使用它,在需要的地方使用它。

相关问题