swift没有嵌套类吗?
例如,我似乎无法从嵌套类访问主类的属性测试。
class master{
var test = 2;
class nested{
init(){
let example = test; //this doesn't work
}
}
}
答案 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中成功测试了它。
以下是该流程的细分:
从现在开始,按照惯例设置一切。
在代码执行区域中,您的嵌套类对象也需要被视为可选(因此'?')。如果你忘了它,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 Nested
与Java's Static Nested
更为相似,因此您无权访问外部类的属性。要访问外部类,可以将其作为参数传递。