【问题标题】:Swift nested class propertiesSwift 嵌套类属性
【发布时间】:2014-11-07 17:38:42
【问题描述】:

swift 没有嵌套类吗?

例如,我似乎无法从嵌套类访问主类的属性测试。

class master{
  var test = 2;

  class nested{
     init(){
       let example = test; //this doesn't work
     }
   }
 }

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    Swift 的嵌套类与 Java 的嵌套类不同。嗯,它们就像 Java 的一种嵌套类,但不是你想的那种。

    在 Java 中,内部类的实例自动具有对外部类实例的引用(除非内部类声明为 static)。如果您有外部类的实例,则只能创建内部类的实例。这就是为什么在 Java 中你会说 this.new nested() 这样的东西。

    在 Swift 中,内部类的实例独立于外部类的任何实例。就好像 Swift 中的所有内部类都是使用 Java 的 static 声明的。如果您希望内部类的实例具有对外部类实例的引用,则必须使其显式:

    class Master {
        var test = 2;
    
        class Nested{
            init(master: Master) {
                let example = master.test;
            }
        }
    
        func f() {
            // Nested is in scope in the body of Master, so this works:
            let n = Nested(master: self)
        }
    }
    
    var m = Master()
    // Outside Master, you must qualify the name of the inner class:
    var n = Master.Nested(master:m)
    
    // This doesn't work because Nested isn't an instance property or function:
    var n2 = m.Nested()
    
    // This doesn't work because Nested isn't in scope here:
    var n3 = Nested(master: m)
    

    【讨论】:

    • 谢谢,虽然有点蹩脚,但这是有道理的。我想正因为如此,在 swift 中使用嵌套类的唯一原因是将类捆绑到命名空间类型中,主类是命名空间。
    • 在Master 的正文中,这会起作用:Nested(master:m)?
    • 是的,因为Nested 在Master 的主体范围内。
    • @NJGUY 嵌套类可能与组织有关,但也可能与信息隐藏有关。 Swift 在此答案所针对的内容中与 C# 匹配,但 Swift 的 private 修饰符不同,因为它创建了一个项目文件范围,而不是类范围。因此,在 Swift 中嵌套一个类是没有意义的,如果它只是为了私人使用;它可以在主类之外定义,并标记为私有。在 C# 中,private 修饰符不能用于非嵌套类。
    • 如果内部类将父类作为实例变量引用,内部类是否应该将父类保持为弱引用?
    【解决方案2】:

    这个解决方案有点类似于我在 C# 中使用它的方式,并且我已经在 Xcode 中成功测试了它。

    以下是该过程的细分:

    1. 您的嵌套类需要设为可选,这样您就不必初始化它,所以有一个“?”在声明中;如果同时初始化父类和嵌套类,最终会产生“递归”效果并生成错误
    2. 创建一个常规函数,接收与主类相同类型的参数
    3. 将该参数传递给您的嵌套类(这可以进入嵌套对象的普通初始化程序)。 - 由于默认情况下对象是通过引用传递的,因此让您的嵌套类链接到父类没有什么特别的
    4. 在嵌套类中,您需要一个与父类相同类型的变量

    从这里开始像往常一样设置一切。

    在代码执行区,你的嵌套类对象也需要被视为可选的(因此有'?')。如果你忘记了,Xcode 无论如何都会添加它。

    在这个例子中,我想设计一个关键字“set”,所以当我设置变量时,我可以输入:

    testClass.set.(and then a descriptive method name)
    

    这是代码,它的目标是在通过嵌套对象设置值之后在控制台中输出“test”:

    class testClass
    {
        var test_string:String = ""
        var set: class_set?
    
        func construct_objects(argument: testClass)
        {
            self.set = class_set(argument: argument)
        }
        class class_set
        {
            var parent:testClass
            init(argument: testClass)
            {
                parent = argument
            }
            func test_string_to_argument(argument: String)
            {
                parent.test_string = argument
            }
        }
    }
    var oTestClass = testClass()
    oTestClass.construct_objects(oTestClass)
    oTestClass.set?.test_string_to_argument("test")
    print(oTestClass.test_string)
    

    【讨论】:

      【解决方案3】:

      为 Swift 和 Java 嵌套

      Swift's Nested 更类似于Java's Static Nested,因此您无权访问外部类的属性。要访问外部类,您可以将其作为参数传递。

      【讨论】:

        猜你喜欢
        • 2019-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多