如何在类中使用外部变量

时间:2017-01-11 15:40:50

标签: ios swift xcode class swift3

我有两个.swift文件,所以我希望其中一个文件修改另一个类的IBoutlet标签的文本。

第1课:

class class1: UIViewController {

    @IBOutlet var label1: UILabel!
}

第2课:

class class2: SKScene {
    var cool_variable = 1

    func coolFunc () {

        class1.label1.text = "\(cool_variable)"
    }
}

通过这样做我收到以下错误消息: 实例成员“label1”不能用于“class2”类型

提前致谢!

3 个答案:

答案 0 :(得分:0)

类和实例之间的区别和关系对面向对象编程绝对至关重要。因此,请考虑您提出的代码:

func coolFunc () {
    class1.label1.text = "\(cool_variable)"
}

此处的问题是class1的名称。 (如果你这样做,那就更明显了,请遵循类名以大写字母开头的基本规则。)但label1是一个实例属性 。因此,您需要的是class1类的实例的名称 - 可能是对已经属于视图层次结构的实际现有实例的引用。

答案 1 :(得分:0)

我不知道您要解决的确切问题,但我只想考虑您要在class1 class2中访问变量的部分。有两种基本方法可以解决这个问题,一种是继承,另一种是创建对象。这些是您需要熟悉的基本面向对象编程概念。

Swift不支持多重继承。因此,除了继承两个类SKSceneUIViewController之外,因此排除继承以解决您的问题。

class1中创建一个对象,然后调用函数coolFunc

class class1: UIViewController {
    @IBOutlet var label1: UILabel!
    func modifyLabel(){
        let someObject = class2()
        someObject.coolFunc()
    }
}

当然,这个解决方案可能不是您正在寻找的解决方案。如果您需要一个适合您的解决方案,您将不得不详细解释您所面临的问题。

答案 2 :(得分:0)

您永远不会在class1中创建class2的实例来访问变量。

我的猜测是你正在使用Storyboard。在这种情况下,您不希望创建class1的实例。相反,你会使用委托(如果你不使用故事板,这也是一个好主意。)

代表团可能是一个复杂的话题,所以我会尽量保持这个简单。

首先,您从一个协议开始。通常你将它命名为<CLASS-NAME>DataSource,所以你会做类似的事情:

protocol class2DataSource: class {}

委派协议需要class关键字。

然后,当您在协议委托的类中调用方法时,您将在其他类中添加要调用的方法,例如,willCoolFunc

protocol class2DataSource: class {
    func willCoolFunc(with variable: Int)
}

您有参数,因此您可以按照自己的意愿访问变量cool_variable

接下来,您需要在class2中创建一个class2DataSource类型的变量:

weak var dataSource: class2DataSource?

确保变量为weak且可选。

接下来,调用方法,您可以在coolFunc

中执行此操作
func coolFunc () {
    dataSource?.willCoolFunc(with: cool_variable)
}

现在,要在调用该函数时访问cool_variable,您需要在class2DataSource上实施class1。创建实现class1的{​​{1}}扩展,并添加函数class2DataSource

willCoolFunc

现在您可以访问extension class1: class2DataSource { func willCoolFunc(with variable: Int) { } } 中的变量cool_variable了!原因是因为当您调用class1时,class2.coolFunc()方法会在传入willCoolFunc的情况下调用。任何实现cool_variable的类都可以访问class2DataSource cool_variable方法。

要完成该方法,扩展的外观如下:

willCoolFunc

我们差不多完成了,但并不完全。我们仍然需要将extension class1: class2DataSource { func willCoolFunc(with variable: Int) { self.label1.text = "\(variable)" } } 设置为class1的数据源。为此,我将从this post

中引用Nikolay Mamaev
  
      
  1. 转到Interface Builder。

  2.   
  3. 在对象库的搜索文本字段中键入“对象”,然后将“对象”拖动到包含连接到的视图控制器   class2DataSource(即执行与添加任何视图或视图控制器相同的操作   故事板场景,除了您不添加视图或视图   控制器,但抽象对象)。

  4.   
  5. 在故事板的左侧“场景”面板中,突出显示刚刚添加的对象;在右侧面板中转到“身份检查员”和   键入class1而不是预定义的NSObject。在左侧   面板('Scenes'),'Object'将重命名为'Class2 Data Source'   自动

  6.   
  7. 在故事板的左侧“场景”面板中,从您的UIView [ *而不是控制器* ]控制拖动到'Class2数据源';   在弹出窗口中,选择dataSource outlet。

  8.   

有!现在,当您致电class2DataSource时,您已将class1的{​​{1}}文字设为label1的值!