sup*_*cio 10 variables initialization uiviewcontroller ios swift
我正在研究这门swift语言,我对a中的变量初始化有疑问UIViewController.在我的DiagramViewController我有一些变数:
class DiagramViewController: UIViewController {
var type: Constants.DiagramType
var filename: String
var numberOfBars: Int
var numberOfSection: Int
var diagramName: String
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
Swift需要这些var的init值,我可以通过多种方式实现,但是我应该如何在这些方式之间做出选择呢?
我可以初始化变量"inline":
class DiagramViewController: UIViewController {
var type: Constants.DiagramType = Constants.DiagramType.HISTOGRAM
var filename: String = "dd.txt"
var numberOfBars: Int = 10
var numberOfSection: Int = 5
var diagramName: String = "Diagram"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
我可以初始化覆盖构造函数的变量:
class DiagramViewController: UIViewController {
var type: Constants.DiagramType
var filename: String
var numberOfBars: Int
var numberOfSection: Int
var diagramName: String
required init(coder aDecoder: NSCoder) {
type = Constants.DiagramType.HISTOGRAM
filename = "dd.txt"
numberOfBars = 10
numberOfSection = 5
diagramName = "Diagram"
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
我可以初始化变量,将它们声明为Optional变量:
class DiagramViewController: UIViewController {
var type: Constants.DiagramType?
var filename: String?
var numberOfBars: Int?
var numberOfSection: Int?
var diagramName: String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
type = Constants.DiagramType.HISTOGRAM
filename = "dd.txt"
numberOfBars = 10
numberOfSection = 5
diagramName = "Diagram"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
我可以初始化变量,将它们声明为Implicitly Unwrapped Optional:
class DiagramViewController: UIViewController {
var type: Constants.DiagramType!
var filename: String!
var numberOfBars: Int!
var numberOfSection: Int!
var diagramName: String!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
type = Constants.DiagramType.HISTOGRAM
filename = "dd.txt"
numberOfBars = 10
numberOfSection = 5
diagramName = "Diagram"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
为什么选择一种方法而不是另一种?有关此问题的典型模式还是某种标准?也许其中一些解决方案比其他解决方案更清洁,甚至更高效.请帮我理解它们之间的区别.先感谢您.
Oxc*_*cug 10
这个问题可归纳为"何时应该使用选项?".关于这个问题有很多很棒的文章和文档,但我会尝试将我的经验与我阅读的文档和文章结合起来.
虽然Optionals在使用时具有非常特定的功能,但我想将它们更多地视为一种关于变量本身而不是声明功能的方式.当我读到:
var myVar:Class? = nil
Run Code Online (Sandbox Code Playgroud)
这意味着,我们永远不应该预期会myVar被分配,而是我们应该始终预测这两个条件,第一个是myVar具有价值,而不是.我假设这些东西是因为?可选项带给表的功能.编译器不允许您在myVar不解包的情况下使用它.因此,编译器建议(无论何时访问属性或函数)使用此语法:
myVar?.myProperty = something
Run Code Online (Sandbox Code Playgroud)
因为?在之前,.这行代码会检查,看是否myVar是nil展开前myVar和执行的代码行.因此,我们预测并处理了这两个条件.如果myVar为nil,那么这行代码基本上会被"忽略",如果不是,则执行.
这与其他类型的可选项形成对比!:
myVar!.myProperty = something
Run Code Online (Sandbox Code Playgroud)
这将始终尝试打开myVar.这行代码将导致异常,说明以下内容:"在展开值时意外发现nil.".虽然?会默默地失败.
如果我们更改声明myVar使用!可选:
var myVar:Class! = nil
Run Code Online (Sandbox Code Playgroud)
然后我们总是可以使用myVar而不会得到编译器错误,说我们需要myVar在使用它之前解包.例如,与其他optional(?)不同,我们可以说:
myVar.myProperty = something
Run Code Online (Sandbox Code Playgroud)
这一行相当于:
myVar!.myProperty = something
Run Code Online (Sandbox Code Playgroud)
如果myVar是nil,那么我们将崩溃该程序.
使用这些选项中的任何一个(或根本不使用可选项)我们告诉用户myVar有关myVar语言强制或不强迫您处理的方式myVar.
?可选var myVar:Class? = nil:如果我使用?可选项,我们实际上是强迫用户始终检查nil.
!可选var myVar:Class! = nil:如果我们使用!那么if myVar是nil,有些东西是错误的,我们应该崩溃程序,但是,用户仍然可以选择处理这种nil情况,如果用户是应该分配的那个用户特别有用myVar.一个很好的用例是网络请求.
var myVar = Class():在任何方面都没有使用可选(显然)变量总是在那里,我们不需要担心它是nil.
| 归档时间: |
|
| 查看次数: |
5930 次 |
| 最近记录: |