我从来没有完全理解过init()是怎么回事.

有没有一个干净,简单的方法来实现我在下面的代码中try 做的事情?

编辑:我想避免重复data = value / 2的逻辑,因为它可能比这个简单的例子复杂得多.我也不想为data提供缺省值或使其成为可选的,因为我想要data被初始化的编译时保证.

fileprivate struct Foo {
    
    var data: Int
    
    var twiceAsMuch: Int {
        set(value) {
            data = value / 2
        }
        get {
            data * 2
        }
        
    }
    
    init(twice: Int) {
        // The following line won't compile because
        // "Self used before all stored properties are initialized"
        self.twiceAsMuch = twice
    }
}

推荐答案

编辑过了此方法仅在计算不依赖于实例变量时有效.

它告诉您,在"init"执行之前,计算变量所需的 struct 状态不会被初始化.

这段代码编译得很好:(我假设您希望在初始化式中划分初始值.

    
fileprivate struct Foo {
    
    var data: Int
    static private func twiceAsMuch(_ v: Int) -> Int { v / 2 }
    var twiceAsMuch: Int {
        set(value) {
            data = Self.twiceAsMuch(value)
        }
        get {
            data * 2
        }
    }
    
    init(twice: Int) {
        self.data = Self.twiceAsMuch(twice)
    }
}

Swift相关问答推荐

纹理资源加载问题(图像解码失败)

了解SWIFT中的任务行为

SwiftUI:为什么@State在子视图中持续存在?

带DispatchSourceTimer的定时器

正在接收具有不完整数据错误的URL请求

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

如何获取嵌套数组中项的路径以修改数组?

调度组是否阻止iOS中的主线程?

我需要一些关于 SwiftUI 动画的帮助

SwiftUI 拖放:如果没有上下文类型,则无法解析对成员‘first’的引用

计算 CoreData 中所有唯一对象的数量?

如何在visionOS中将模型锚定在用户头部上方?

如何在 SwiftUI 中创建条件内容?

如何在 Combine 合并运算符的输出上使用 eraseToAnyPublisher

P384 公钥获取IncorrectParameterSize

Subclass.fetchRequest() Swift 3.0,扩展并没有真正帮助 100%?

playground 导入:没有这样的模块Foo

如何快速识别字符串中的大写和小写字符?

Swift 中的可选数组与空数组

枚举大小写的原始值必须是文字