【问题标题】:Is it common/ok to declare global class instances in Swift/iOS在 Swift/iOS 中声明全局类实例是否常见/可以
【发布时间】:2016-01-06 13:17:30
【问题描述】:

我最近在 Lynda.com 上观看了video tutorial,我注意到作者声明了一些包含两个类实例的全局变量。我的问题的主要原因是因为我听说我们需要尽量避免使用全局变量,除非你真的需要它们。我可以看到 NSUserDefaults' Keys 使用全局变量,但我不确定全局实例。

这是显示全局变量声明的代码。我只关心变量masterViewdetailViewController

import UIKit

var objects:[String] = [String]()
var currentIndex:Int = 0

var masterView:MasterViewController?
var detailViewController:DetailViewController?

let kNotes:String = "notes"
let BLANK_NOTE:String = "(New Note)"

class MasterViewController: UITableViewController {

     // class code 

}

可以将你的类实例声明为全局变量吗?

【问题讨论】:

  • 我没看过视频,但可能这只是为了学习(即在操场上)?在 Playground 中,不属于闭包(类、结构、函数)的所有变量本身都是“Playground 全局变量”。通常,我们希望避免使用全局变量(如您所说),包括类实例。

标签: ios swift global-variables


【解决方案1】:

从技术角度来看,在您的 Swift 代码中使用全局变量当然是可以的,因为您的程序不会因此而崩溃或“行为不端”。当您为演示构建一个快速示例时,全局变量提供了一种缩短代码的便捷方式。

但是,使用可变全局变量存在一些缺点,这使得它们的使用存在问题。具体来说,它们打破了封装。查看您提供的代码,两个变量

var objects:[String] = [String]()
var currentIndex:Int = 0

应该隐藏在模型对象中,您可以对其进行一定程度的控制。

如果您不小心清除它们,使用全局变量可能会产生一些意外行为。例如

var masterView:MasterViewController?
var detailViewController:DetailViewController?

可能会保留对不再可见的视图控制器的引用。

【讨论】:

  • 我明白,为了快速演示,它会让你的代码更干净,但我不确定展示不良做法是否是一个好主意,因为本教程是关于创建一个 Notes App 的主要原因我观看它是为了了解代码在实际应用程序中的结构。正如您一样,我还注意到他添加的可变变量,我知道这可能会导致问题,但我不确定全局实例是否常见。你知道任何按照良好的编程模式创建应用程序的教程吗?
  • @fs_tigre 我同意,演示应该尽可能地使用最佳实践。另一方面,制作一个构建应用程序的演示会非常困难,因为需要的部分太多。我不知道任何这样的演示或教程。关于我的应用程序的高级结构化主题对我来说最有用的读物​​是 Apple 的 MVC discussion
【解决方案2】:

如果您希望在整个应用工作中只使用该类的一个实例,可以将类实例声明为全局变量。
注意:您可以隐藏这些实例通过将您不想被全局实例变量访问的那些私有设置为该实例的属性和功能。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2016-03-19
    • 2013-09-20
    相关资源
    最近更新 更多