Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:从另一个函数和/或类引用一个类中的变量_Swift_Macos_Class_Variables - Fatal编程技术网

Swift:从另一个函数和/或类引用一个类中的变量

Swift:从另一个函数和/或类引用一个类中的变量,swift,macos,class,variables,Swift,Macos,Class,Variables,在斯威夫特尝试一些事情。我正试图弄清楚一些对我来说似乎很混乱的事情——主要是关于我如何处理变量以及如何在项目中引用它们 我试图做的是保持一个基于ViewController中定义的结构的变量从应用程序中的各种其他函数访问和更新 下面是我的代码的简要概述。实际上,我写了一个更小的应用程序来测试我的想法,然后再将它们应用到更复杂的事情上 我从XCode开始为MacOSX开发了一个基于Swift文档的应用程序 在ViewController.swift中,我有: import Cocoa class

在斯威夫特尝试一些事情。我正试图弄清楚一些对我来说似乎很混乱的事情——主要是关于我如何处理变量以及如何在项目中引用它们

我试图做的是保持一个基于ViewController中定义的结构的变量从应用程序中的各种其他函数访问和更新

下面是我的代码的简要概述。实际上,我写了一个更小的应用程序来测试我的想法,然后再将它们应用到更复杂的事情上

我从XCode开始为MacOSX开发了一个基于Swift文档的应用程序

在ViewController.swift中,我有:

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设计模式。