Swift嵌套类属性

时间:2014-11-07 17:38:42

标签: ios swift

swift没有嵌套类吗?

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

class master{
  var test = 2;

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

3 个答案:

答案 0 :(得分:80)

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)

答案 1 :(得分:3)

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

以下是该流程的细分:

  1. 您的嵌套课程必须是可选的,因此您不必对其进行初始化,因此您需要这样做?'?'在声明中;如果你初始化你的父类和嵌套类,你最终会得到一个'递归'效果和生成错误
  2. 创建一个常规函数,该函数接收与主类相同类型的参数
  3. 将该参数传递给嵌套类(这可以进入嵌套对象的常规初始化程序)。 - 由于默认情况下对象是通过引用传递的,所以没有什么特别的东西可以让你的嵌套类链接到父类
  4. 在嵌套类中,您需要一个与父类相同类型的变量
  5. 从现在开始,按照惯例设置一切。

    在代码执行区域中,您的嵌套类对象也需要被视为可选(因此'?')。如果你忘了它,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)
    

答案 2 :(得分:0)

嵌套到Swift和Java

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