swift 3中的全局变量

Posted

技术标签:

【中文标题】swift 3中的全局变量【英文标题】:Global variable in swift 3 【发布时间】:2017-11-09 22:18:27 【问题描述】:

我有一个变量 provincias_ws,它有一个服务的答案,到目前为止一切都很好,但我想知道我如何使变量 provincias_ws 是全局的,因为我想在 textFieldDidBeginEditing 方法中打印它

class ViewCtrl: UIViewController, ValidationDelegate, UITextFieldDelegate 
    @IBOutlet weak var txt_ciudadU: SearchTextField!
    override func viewDidLoad() 
        super.viewDidLoad()
        opciones_autocompletado()
        txt_ciudadU.delegate = self
    
    func opciones_autocompletado()
        txt_provinciaU.inlineMode = true
        txt_ciudadU.inlineMode = true
        Services.objServices.ServProv().then
            data -> Void in
            let res = JSON(data)
            let status = res["status"].boolValue
            if(status)
                let provincias_ws = res["data"]["provincias"] //How to make this variable global
            else
                let error = res["error"]["error_data"].stringValue
                print(error)
            
            SVProgressHUD.dismiss()
            UIApplication.shared.endIgnoringInteractionEvents()
            .catch
                error -> Void in
                SVProgressHUD.dismiss()
                UIApplication.shared.endIgnoringInteractionEvents()
        
    
    func textFieldDidBeginEditing(_ textField: UITextField) 
        print(provincias_ws)
    

提前谢谢你

【问题讨论】:

你为什么不把它变成一个类实例变量呢?但是,如果您希望它是全局的,您可以在 class 块之外定义它。 我该怎么做?我是新来的 swift 您的文本字段txt_ciudadU 是类的实例变量或属性。这将是相同的,只是没有@IBOutletweak。所以可能类似于var provincias_ws: String(假设它是String),你会将它放在与文本字段变量相同的层次结构级别。您将摆脱当前的let 旁边的provincias_ws 并在它前面加上self.(即self.provincias_ws = res["data"]["provincias"]),因为它在一个块内并且需要它作为上下文。 我的 provincias_ws 是 JSON 类型,如何在全局中声明? 将上面的评论移至答案。而“JSON”并不是真正的类型。我不知道您的 JSON 数据的结构,但看起来它可能是一个字符串数组? 【参考方案1】:

可以通过在类块之外定义它来创建“全局”变量(意味着可以从项目中的任何位置访问它)。

但是,看起来你想要的是一个类实例变量。

您的文本字段txt_ciudadU 已经是ViewCtrl 类的实例变量或属性的示例。

这将是相同的,只是没有@IBOutlet weak

可能是这样(假设它是一个字符串):

var provincias_ws: String?

注意? 将它声明为一个可选值,因为它在被设置到你的块中之前不会被设置。您还可以将其初始化为某个默认值或空值(例如var provincias_ws = ""),或者您可以使用! 表示您不会在它为 nil 时尝试解包,尽管最好不要依赖它,因为它是容易出错。您选择做什么取决于您的需求。

并且您可以将它放在与文本字段变量相同的层次结构级别(即在它的上方或下方,尽管它实际上可以放在任何地方,只要它不在函数或另一个块内)。

你会去掉provincias_ws旁边的当前let,并在它前面加上self.,即:

self.provincias_ws = res["data"]["provincias"]

self. 是必需的,因为它位于块内,编译器需要它作为上下文。

【讨论】:

我也这样做了,但是我得到了这个错误:不能用字符串类型的索引为 JSON 类型的值下标 那么,您使用的任何提供此JSON 对象的库都不支持像您所做的那样使用字符串值下标(即res["data"])。这与您帖子的问题无关。 您之前没有收到该错误吗...?此外,您还没有真正提供足够的信息来确定 JSON 数据的结构,因此上述 var 的类型 (String) 只是一个示例……您必须将其更改为您期望的任何内容。 我正在使用 SwiftyJSON 您的原始代码中是否存在编译器错误?如果不是,它说provincias_ws 是什么类型? (选项点击变量名)

以上是关于swift 3中的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Swift 中使用全局变量

全局变量/常量如何在 swift 中变得懒惰

Swift:不需要的全局变量声明

Swift 中全局变量和函数的最佳实践是啥?

Swift-使用完成处理程序更新闭包外的全局变量

无法将坐标放入全局变量 [CLgeocoder, swift4]