Swift嵌套的类属性
swift没有嵌套类吗?
例如,我似乎无法从嵌套类访问主类的属性testing。
class master{ var test = 2; class nested{ init(){ let example = test; //this doesn't work } } }
Swift的嵌套类不像Java的嵌套类。 那么,它们就像一种Java的嵌套类,但不是你想的那种。
在Java中,内部类的实例会自动引用外部类的实例(除非内部类声明为static
)。 如果您有外部类的实例,则只能创build内部类的实例。 这就是为什么在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)
这个解决scheme与我在C#中使用它的方式类似,我已经在Xcode中成功地进行了testing。
以下是这个过程的细节:
- 你的嵌套类需要做成可选的,所以你不必初始化它,所以它们是'?' 在宣言中; 如果初始化父类和嵌套类,则最终会产生“recursion”效果,并生成错误
- 创build一个接收与您的主类相同types的参数的常规函数
- 将这个parameter passing给你的嵌套类(这可以进入嵌套对象的普通初始化)。 – 由于默认情况下通过引用传递对象,所以没有什么特别的要让你的嵌套类链接到父类
- 在你的嵌套类中,你需要一个和父类相同types的variables
从这里开始,像往常一样设置一切。
在代码执行区域中,您的嵌套类对象也需要被视为可选(因此是'?')。 如果你忘了它,Xcode会添加它。
在这个例子中,我想devise一个关键字“set”,所以当我设置variables时,我可以input:
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)