【问题标题】:Access variable in different class - Swift不同类中的访问变量 - Swift
【发布时间】:2014-08-11 13:23:52
【问题描述】:

我有两个 swift 文件:

main.swiftview.swift

在 main.swift 我有一个 variable (Int) 最初设置为 0

使用IBACtion,我将variable 设置为10,一切正常。

但是,如果我尝试从 view.swift 访问 variable,通过像 main().getValue() 这样的简单调用,我总是得到 0 而不是 10,即使变量有在 main.swift 中更改了它的值。

ma​​in.swift 中的方法getValue() 如下所示:

func getValue() -> Int {
return variable
}

编辑

这是代码(翻译自意大利语:D)

import Cocoa

class Main: NSObject {

    var variable: Int = 0

    func getValue() -> Int {
        return variable
    }

    @IBAction func updateVar(sender: AnyObject!) {
        variable = 10
    }
}

class View: NSView {
    override func drawRect(dirtyRect: NSRect) {
       println(Main().getValue()) //Returns always 0
    }
}

提前致谢 阿尔贝托

【问题讨论】:

  • 我们需要看看变量是如何定义的。它是在类还是结构中定义的?您如何尝试访问其他文件中的值?
  • 在类中定义。我正在尝试访问其他类中的变量,只需键入 main().getValue()
  • 通过键入main(),您正在创建main 类的新实例,variable 的默认值为 (0)
  • 到目前为止你告诉我们的还有很多未知数。首先,文件在 swift 中并不重要。这都是关于类/结构和实例的。 main 是你班级的名字吗(通常班级都是大写的)?另外,您使用的是Xib 文件吗?我很奇怪将IBAction 与一个简单地称为main 的类一起使用。通常它是 UIKit 或 Cocoa 视图或控制器类的子类。
  • 是的,我们需要查看更多代码 :) 这里还不够

标签: class methods swift


【解决方案1】:

我通过创建一个可供所有视图访问的通用主类解决了这个问题。创建一个空的 swift 文件,将其命名为“global.swift”并将其包含在您的项目中:

global.swift:

class Main {
  var name:String
  init(name:String) {
    self.name = name
  }
}
var mainInstance = Main(name:"My Global Class")

您现在可以从所有视图控制器访问此 mainInstance,并且名称将始终为“My Global Class”。来自 viewController 的示例:

视图控制器:

override func viewDidLoad() {
        super.viewDidLoad()
        println("global class is " + mainInstance.name)
    }

【讨论】:

  • 这正是我所需要的。谢谢!
  • 谢谢。我一直在想这个问题 6 个月(我的整个 swift 职业生涯......)我现在已经学会了如何存储可访问、可设置和可获取的全局变量,并可以从任何地方进行修改......!!!!啊啊啊,谢谢!!!
  • 这似乎是一个不错的答案,但作为程序员避免使用全局变量,这难道不是我们的目标之一吗?
  • 非常感谢您!!!!为我省去了使用结构、NSUserDefaults、类实例等的所有麻烦!
  • 谢谢!为我节省了很多时间和挫败感:P
【解决方案2】:

在 Swift 中的“文件”和“类”之间有一个重要的区别。文件与类没有任何关系。您可以在一个文件中定义 1000 个类或在 1000 个文件中定义 1 个类(使用扩展名)。数据保存在类的实例中,而不是文件本身。

所以现在解决问题。通过调用Main(),您正在创建一个全新的Main 类的实例,它与您连接到Xib 文件的实例无关。这就是该值作为默认值出现的原因。

您需要做的是找到一种方法来获取对与您的 Xib 中的相同实例的引用。在不了解您的应用架构的更多信息的情况下,我很难就此提出建议。

一个想法是,您可以使用 View 中的 IBOutlet 在 Xib 中添加对 Main 实例的引用。然后你可以简单地做self.main.getValue(),它会在正确的实例上被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多