【问题标题】:Swift variable type setting to superclass handle subclassesSwift 变量类型设置到超类处理子类
【发布时间】:2021-08-18 21:57:00
【问题描述】:

如何在 Swift 中处理具有主类类型但传递给子类实例的变量?

这是一段示例代码:

class MainClass {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

class Num1: MainClass {
    var num: Int = 1
}

class Num2: MainClass {
    var num: Int = 2
}

struct ExampleView: View {
    var subClassInstance: MainClass
    
    var body: some View {
        Text(subClassInstance.name)
        Text(subClassInstance.num) // trying to access this property
    }
}
let example = ExampleView(subClassInstance: Num1(name: "test"))

具体来说,我希望能够从具有主类类型的变量访问子类属性。在我的示例的上下文中,我希望能够从具有 MainClass 类型的视图中的变量访问传递的子类实例的“num”属性。这可能吗?这样做的动机是让一个视图与一个主类的类似子类一起工作——不必编写两个视图,一个将变量设置为每个子类的类型。

【问题讨论】:

    标签: swift inheritance subclassing


    【解决方案1】:

    您可以将num 作为MainClass 中的属性。这意味着您可以从MainClass 本身或任何子类访问num

    例子:

    class MainClass {
        var name: String
        var num: Int
    
        init(name: String, num: Int) {
            self.name = name
            self.num = num
        }
    }
    
    class Num1: MainClass {
        init(name: String) {
            super.init(name: name, num: 1)
        }
    }
    
    class Num2: MainClass {
        init(name: String) {
            super.init(name: name, num: 2)
        }
    }
    
    struct ExampleView: View {
        var subClassInstance: MainClass
    
        var body: some View {
            Text(subClassInstance.name)
            Text(String(subClassInstance.num))
        }
    }
    let example = ExampleView(subClassInstance: Num1(name: "test"))
    

    查看旧答案的编辑历史记录

    【讨论】:

    • 我认为这可以扩展为适用于 num1 或 num2...
    • @JohnSorensen 理想情况下,您应该将num 作为MainClass 中的属性。
    • 是的,看起来要走的路是将它作为主类中的属性,但在子类中覆盖
    • 虽然我还不清楚属性覆盖语法哈哈
    • @JohnSorensen 我重新做了答案。这次使用num 作为属性。在这种情况下,我假设您想保留默认的 num 值,所以我这样做了。看看,这就是你所追求的吗?
    【解决方案2】:

    如果属性被不同的子类使用,通常的做法是在超类(您的MainClass)中包含属性,我不会在这里复制其他答案,乔治解释得很好

    (这个答案是关于如果 Georges 的答案不适合怎么办,例如当您需要子类中的不同属性时)

    为了你自己的理解,应该可以Type Cast你的ExampleView.subClassInstanceNum1或者Num2

    有两种方法可以做到这一点

    let numInstance = subClassInstance as? Num1

    let numInstance = subClassInstance as! Num1

    作为?将尝试将downcastMainClass 转换为Num1,如果由于某种原因失败,将尝试return nil

    作为!将尝试将downcastMainClass 转换为Num1 并抛出一个错误,如果失败会导致您的应用崩溃

    如果一切顺利,你应该可以使用

    Text(numInstance.num)

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多