实例成员不能用于 struct swift 之间的嵌套类型的实例

Posted

技术标签:

【中文标题】实例成员不能用于 struct swift 之间的嵌套类型的实例【英文标题】:Instance member cannot be used on instance of nested type between struct swift 【发布时间】:2021-09-14 19:45:30 【问题描述】:

我正在尝试将变量 code 从结构 FormularyDetail 传递到嵌套结构 WebView 但继续收到错误

“FormularyDetail”类型的实例成员“代码”不能用于嵌套类型“FormularyDetail.WebView”的实例。

我的快速代码如下:

struct FormularyDetail: View 
    var drugmaster: DrugMaster
    var code: String  
        get 
            return drugmaster.code
        
    

    let testhtml = Bundle.main.url(forResource: "www/index", withExtension: "html")
    struct WebView: UIViewRepresentable 
        
        let request: URLRequest
        static var codein: String 
            get 
                return FormularyDetail.code //I got the error on this line
            
        
...

感谢任何帮助。

【问题讨论】:

嵌套类型定义不允许您访问外部类型属性。将它们视为两种不相关的类型。如果您需要访问code,则需要将其传入,例如通过init 即使可以从封闭类型访问属性,尝试从静态上下文访问实例属性时仍会遇到问题,这是不可能的。您究竟想在这里实现什么目标? 【参考方案1】:

虽然有些语言确实允许嵌套类型访问封闭类型的实例成员,但 Swift 不是其中之一。嵌套类型是一种独特的类型。嵌套类型的主要优点与封装它有关。它有效地为其提供了一个名称空间,允许您使用更简单的名称,而不会与嵌套在其他类型中的同名类型发生冲突。当它们是实现细节时,它还允许您将它们设为类型私有。

考虑到这一点,如何访问封闭类型的实例属性的答案与在全局范围内定义的答案相同。也就是说,你注入它。初始化时传入值。

由于您提供的代码显然是针对 SwiftUI 视图的,因此您需要考虑 WebView 是否需要动态响应对 drugmaster.code 的更新,并相应地使用 @State@StateObject

【讨论】:

以上是关于实例成员不能用于 struct swift 之间的嵌套类型的实例的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2 实例成员“circleIndexes”不能用于“GameScene”类型

Swift Playground - 实例成员不能用于类型自定义类

实例成员不能用于类型 - 错误

无法在 Swift 中获取 UITextField 的 .text 属性 - 错误:“实例成员 'textFieldName' 不能用于类型 'ViewController'

Xcode Swift 2 变量声明(实例成员不能在类型视图控制器上使用)

在 Swift 3 中将类与同名的实例成员区分开来