Swift 最佳临时储存措施

Swift 最佳临时储存措施,swift,storage,Swift,Storage,我正在开发一个应用程序,我需要在视图控制器之间移动很多时间,主要是做一个循环,但现在我必须存储一些数据(简单变量和数组) 我目前正在将它们存储在app delegate中,但我不知道这是否是一个好主意。我在网上查过,但我真的不知道什么是最适合我的解决方案。 我是这样设置的: Appdelegate: var aantalSpelers: Int! var namenSpelers = [String]() var youself = KaartenSpeler() var player2 =

我正在开发一个应用程序,我需要在视图控制器之间移动很多时间,主要是做一个循环,但现在我必须存储一些数据(简单变量和数组)

我目前正在将它们存储在app delegate中,但我不知道这是否是一个好主意。我在网上查过,但我真的不知道什么是最适合我的解决方案。
我是这样设置的: Appdelegate:

var aantalSpelers: Int!
var namenSpelers = [String]()

var youself = KaartenSpeler()
var player2 = KaartenSpeler()
var player3 = KaartenSpeler()
var player4 = KaartenSpeler()
var player5 = KaartenSpeler()
var player6 = KaartenSpeler()

var Vragen = [[0,0,0,0,0,5]]
var VragenOnbekend = [[6,0,0,0,0,0]]
var VragenInformatie = [[["Spelletjeskamer",""],["Keuken",""],["Garage",""],["Binnenplaats",""],["Zitkamer",""],["Slaapkamer",""],["Studeerkamer",""],["Eetkamer",""],["Badkamer",""]], [["De Wit",""],["Pimpel",""],["Blaauw van Draet",""],["Roodhart",""],["Groenewoud",""],["Van Geelen",""]], [["Loden pijp",""],["Pistool",""],["Engelse sleutel",""],["Dolk",""],["Touw",""],["Kandelaar",""]]]
var EersteKeerMainScreen = true
在VC中:

func Appdelegate() -> AppDelegate {
    return UIApplication.sharedApplication().delegate as! AppDelegate
}

let sections = ["Locaties","Personages","Wapens"]

var aantalSpelers: Int!
var namenSpelers = [String]()
var eersteKaarten = [[Int(),Int()]]

var youself: KaartenSpeler!
var player2: KaartenSpeler!
var player3: KaartenSpeler!
var player4: KaartenSpeler!
var player5: KaartenSpeler!
var player6: KaartenSpeler!

//vraag is: [numberVrager,numerGevraagde,numerLocatie,numerPersonage,numerWapen,0=lietgeenkaartzien - 1=locatie, - 2=personage - 3=wapen - 4=onbekend]
var Vragen = [[]]
var VragenOnbekend = [[]]
var VragenInformatie = []

var EersteKeerMainScreen = false

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    //Get information back from appdelegate
    aantalSpelers = Appdelegate().aantalSpelers
    namenSpelers = Appdelegate().namenSpelers

    youself = Appdelegate().youself
    player2 = Appdelegate().player2
    player3 = Appdelegate().player3
    player4 = Appdelegate().player4
    player5 = Appdelegate().player5
    player6 = Appdelegate().player6

    Vragen = Appdelegate().Vragen
    VragenOnbekend = Appdelegate().VragenOnbekend
    VragenInformatie = Appdelegate().VragenInformatie
    EersteKeerMainScreen = Appdelegate().EersteKeerMainScreen
这真的是一个可行的选择吗

顺便说一句,很抱歉我的英语不好

在这种情况下,我使用的方法(可能不是最好的)是使用segues通过self.performsguewithidentifier(“seguetile”,sender)传递变量

然后,您可以在prepareForSegue中实际处理从这个VC移动到另一个VC的对象

e、 g

无论何时完成视图控制器的逻辑编写,请使用:

self.performSegueWithIdentifier("segueTitle", sender: self)
现在,要处理要传递给下一个VC的内容,请添加以下内容:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if (segue.identifier == "segueTitle") {
            // pass data to next view
            let destinationVC = segue.destinationViewController as! YourNextViewController
            destinationVC.numbersArray = self.numbersArray;

    }
}
需要记住的是,在下一个VC中必须有相同的全局变量,正如您在上面的示例中看到的,我们将当前变量分配给下一个。还要确保segue是通过故事板创建和连接的,并用给定的标题替换SegueTTitle

更新:例如TransferClass

class TranferClass {
   var numbersArray:[String] = []

}
然后实例化该类并将其发送给下一个VC。例如:

在VC 1中:

/*in global scope*/
var transferObject = TransferClass()
在同一个VC中,设置数组,例如:

self.transferObject.numbersArray[0] = "Hello"
然后触发segue:

self.performSegueWithIdentifier(...)
然后处理传球:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            if (segue.identifier == "segueTitle") {
                // pass data to next view
                let destinationVC = segue.destinationViewController as! YourNextViewController
                destinationVC.transferObject = self.transferObject;

        }
    }

您最初的想法是,您可能不应该将这些存储在AppDelegate中。我建议创建一个新类或一个可以保存这些值的结构


但我注意到的另一件事是,
KaartenSpeler
已经有了一个单独的类,所以你一定要注意retain cycles,确保这些类之间没有强引用。

我已经想到了这一点,但我不需要在大多数vc上使用所有变量。我有一个主屏幕,然后我移动到其他屏幕,在那里我只向阵列的s@Cing我创建了一个swift类,其中包含多个不同类型的变量。然后,这会使代码更简洁,管理的变量更少。然后你传递一个类的实例,在需要的时候和需要的地方设置变量saying@Cing这比另一个选项好。不要为变量创建单例,传递它们更好。我个人会选择协议委托模式:@DanBeaulieu感谢您提供了更多的帮助选项:)我应该把结构放在哪里,应该如何编写它?@Cing他说的是单例模式。这里有一个很好的教程:我如何知道它是否有一个强引用循环,以及如何避免它如果你引用了你的类中的另一个类,那么你就有可能创建一个强引用。只要在创建一个变量时使用“弱变量”,该变量将保存一个类对象。如果您对@ksa_coder的答案有疑问,您可以在这里按照我的视频教程进行操作。如果你让它工作,确保你给ksa_编码器信用!为此,我需要更多地阅读您的教程,但我不太确定如何使用多个vc甚至导航控制器进行设置。完成后,我将投票给Ksa_编码器。)我正试图让协议代表处理另一个项目。但我如何让它与导航控制器一起工作呢?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            if (segue.identifier == "segueTitle") {
                // pass data to next view
                let destinationVC = segue.destinationViewController as! YourNextViewController
                destinationVC.transferObject = self.transferObject;

        }
    }