Swift - 使用单例来共享变量 - 不会传递

时间:2016-01-06 20:42:15

标签: swift singleton segue

所以这真令人沮丧。我尝试使用单例来传递字符串变量,但它没有在第二个UIViewController上传递。

Singleton.swift

class CardName {

var cardName : String = ""

class var sharedInstance : CardName {
    struct Static {
        static let instance : CardName = CardName()
    }
    return Static.instance
}

var returnedCardName : String {
    get{
        return self.cardName
    }

    set {
        self.cardName = newValue
    }
}}

查看1:

CardName.sharedInstance.returnedCardName = "Single pass test"

print("Shared instance name set: \(CardName.sharedInstance.returnedCardName)")

print()成功显示正确设置的字符串。

观看2:

let card_name_shared = CardName.sharedInstance

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

    card_Name = card_name_shared.returnedCardName
    print("Passed Card Name: \(self.card_name_shared.returnedCardName)")

}

查看2 print()结果:

Passed Card Name:

我有一些其他观点的设置完全相同,但我不知道它为什么不起作用。

我用

self.performSegueWithIdentifier("segue", sender: nil)

转到下一个视图。我不知道这与它有什么关系。

我不明白覆盖功能prepareForSegue是如何工作的,或者它是否有用。

1 个答案:

答案 0 :(得分:4)

答案

您确定在>之后阅读了这个值吗?

请检查它是否添加断点。

这是您可以将阅读从viewDidLoad移至viewDidAppear的问题。

少即是多

您的Singleton正在运作

// from my Playground
CardName.sharedInstance.returnedCardName = "123"
CardName.sharedInstance.returnedCardName // "123"

但是确实包含许多无用且冗余的代码:D

这是一个更好的版本

class CardName {
    static var sharedInstance = CardName()
    private init() {}

    var cardName: String?
}

请使用

CardName.sharedInstance.cardName = "something"

保存值。

CardName.sharedInstance.cardName

读取该值。

可选属性

如您所见,新属性被声明为Optional String。这意味着它可以包含nil。这是表示缺少价值的更好方式,而不是您正在使用的空String