Swift:从另一个函数和/或类引用一个类中的变量
在斯威夫特尝试一些事情。我正试图弄清楚一些对我来说似乎很混乱的事情——主要是关于我如何处理变量以及如何在项目中引用它们 我试图做的是保持一个基于ViewController中定义的结构的变量从应用程序中的各种其他函数访问和更新 下面是我的代码的简要概述。实际上,我写了一个更小的应用程序来测试我的想法,然后再将它们应用到更复杂的事情上 我从XCode开始为MacOSX开发了一个基于Swift文档的应用程序 在ViewController.swift中,我有:Swift:从另一个函数和/或类引用一个类中的变量,swift,macos,class,variables,Swift,Macos,Class,Variables,在斯威夫特尝试一些事情。我正试图弄清楚一些对我来说似乎很混乱的事情——主要是关于我如何处理变量以及如何在项目中引用它们 我试图做的是保持一个基于ViewController中定义的结构的变量从应用程序中的各种其他函数访问和更新 下面是我的代码的简要概述。实际上,我写了一个更小的应用程序来测试我的想法,然后再将它们应用到更复杂的事情上 我从XCode开始为MacOSX开发了一个基于Swift文档的应用程序 在ViewController.swift中,我有: import Cocoa class
import Cocoa
class ViewController: NSViewController {
var myText = "Hello, some text"
@IBOutlet weak var textView1: NSTextField!
@IBAction func Button1(_ sender: Any) {
myText = "This is button 1 clicked"
myText = setText( thisText: &myText )
textView1.stringValue = myText
}
@IBAction func Button2(_ sender: Any) {
print("Button 2")
myText = "This is button 2 clicked"
textView1.stringValue = myText
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
textView1.stringValue = myText
}
override func viewDidAppear() {
let document = self.view.window?.windowController?.document as! Document
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
在SetText.swift中,我有:
import Foundation
func setText( thisText: inout String) -> String {
thisText = "Function"
return thisText
}
我喜欢将变量发送到Set文本函数,然后返回它的想法,但仔细想想,我觉得实际上这可能会像一碗意大利面,上面有函数调用函数,谁知道还有什么。所以我想这样的事情可能更有意义:
import Foundation
func setText( thisText: inout String) {
let vc = ViewController()
// Read the variable from View Controller
var myTextHere = vc.myText
myTextHere = myTextHere + " More text"
// Set the variable in ViewController here
vc.myText = myTextHere
}
从我对这个主题的阅读来看,若我调用ViewController,它将创建一个新的视图实例,是这样吗,还是我误读了?。这已经发生了,所以我需要引用调用函数setText的ViewController,或者更确切地说,它拥有特定的代码实例。在考虑基于文档的应用程序时,我显然希望将myText的所有实例保留在每个文档的ViewController中
我的目标是创建更复杂的东西,使用基于结构的变量将所有内容保持在一起。因此:
myCard.image // holds a bitmap image
myCard.size // holds the size of the image
等等。能够以ViewController.myCard的形式访问它进行读写是我认为我需要做的事情
我不想做的是使用全局变量
谢谢。我很难看出你问题的标题和问题的主体之间有多大的关联。事实上,我甚至不能完全确定是否有人问我一个问题。也就是说,我将尝试解决您似乎要问的问题,并重新编写我认为这些问题的用意: 初始化新视图控制器时,它是否创建新视图 对。每个视图控制器都有一个视图属性,它不是共享组件、单例或任何类似的东西。每个视图控制器都有一个主视图。它几乎肯定由几十个子视图组成,但有一个视图是每个视图控制器的视图 有没有办法从外部获取有关视图控制器状态的元数据,最好是以结构的形式 当然。首先,您需要定义该卡结构。我建议在与视图控制器本身相同的文件中执行此操作。您可以在视图控制器外部定义它,或者如果您想要更严格的耦合和名称空间,可以在视图控制器内部进行定义。请注意,执行后一种操作将意味着在视图控制器外部引用的类型名称将是ViewController.Card,而不仅仅是Card 然后,您需要在视图控制器上创建一个计算属性var card:card或一个方法func card->card,该方法基于状态构建并返回其中一个属性。听起来你已经倾向于财产法了 注意:我绝对不建议使用一个普通的get/set属性,因为这样您就必须不断地更新和修改它。最好的方法是使用一个计算属性动态地构建它。因此,当属性被调用时,它会进入您的所有组件,以获取您想要的信息,如图像大小、字符串等,然后打包并交出卡元数据结构。这样按需操作可以消除不必要的复杂性,并将元数据逻辑整合到一个位置 您的代码示例中有一些危险的东西: 我想不出一个好的理由来实现ViewDidDisplay,但不调用super.ViewDidDisplay。除非你有一个非常有说服力的理由把它删掉,否则我真的想不出一个,不要这样做。 我看不出您第一次实现setTextthisText:方法有什么好的理由。您在按钮中使用它的方式1_uu发送者:任何IBAction在功能上都不会做任何事情。该方法通常有几个原因:它有一个大写的方法名,由于一些非常奇怪的原因试图分配给stringValue来设置textView文本,并在三行中完成一行中可以完成的操作: textView1.text=这是单击的按钮1 setTextthisText:的第二个实现比前一个实现更有意义。最大的两个问题是1你甚至没有使用传入的thisText参数,2你的方法,叫做“set text”,每次被调用时都会创建一个全新的视图控制器?这是一个巨大的违反行为 罐头上写着什么。方法应该有一个单一的责任,并且不应该做超出这个责任的任何事情。在一百万年内,我从未见过一个名为setText的方法,我敢打赌它会初始化一个视图控制器。从来没有 我发现这个问题已经被我否决了一点,我想花点时间来指导您如何使用堆栈溢出:就清晰、简洁、具体的主题提出清晰、简洁、具体的问题。正如我在回答的顶部所说,在你的帖子中似乎没有问题。从你写的东西中我推断出了一些事实 记住:编码不仅仅是在你思考一个应用程序时摆动你的手指。如果你在做优秀工程的艰苦工作,你可能会花费10:1或更多的比例!盯着你的屏幕输入任何代码。每次你写一行代码时,你都应该问自己,我为什么要写这行代码?这有必要吗?我是在重新发明轮子吗
祝你好运 尝试搜索已经回答过的类似问题。这里有大量的设计模式,你应该看看如何更具体地采用Cocoa设计模式。