我的视图控制器中有一个数组。只有在它为零时才应该分配它,否则它应该返回现有值。
Objective C equivalent:
- (NSArray*)states{
if(!_states)
{
_states = //read files from json and assigned to array
}
return _states;
}
我必须迅速实现这一目标。我尝试使用存储属性但无法实现此
实现这一目标的最佳方式是什么
答案 0 :(得分:3)
可能是这样的:
class Whatever {
private(set) var _states: [AnyObject]?
var states: [AnyObject] {
get{
if let st = _states {
return st
}
else {
// Read from file
_states = ....
return _states!
}
}
}
}
在SWIFT中,没有实例变量的概念,只有属性,通过写这个private(set) var _states: [AnyObject]?
,我们说_states不能从我们的类之外写,而只是在里面。然后我们创建一个只读属性,如果它不是nil或者用数据填充它,我们_states
将它绑定到st
。class Whatever {
lazy var states: [AnyObject] = {
return array read from file
}()
}
将它绑定到var express = require('express') ;
var app = express() ;
var server = require('http').createServer(app) ;
var socket = require('socket.io')(server) ;
。
还有一种SWIFTY方法可以做到这一点,称为延迟属性:
server.listen(8080) ;
通过使用lazy,我们说只在第一次调用属性时创建该数组,一旦设置它将永远不会再创建,但只是返回。基本上它不会再次从文件传递给数组。
答案 1 :(得分:3)
我们也可以在Swift 3.0中使用。
private var _designContentViewController: DesignContentViewController?
var designContentViewController: DesignContentViewController? {
get {
if _designContentViewController == nil {
_designContentViewController = DesignContentViewController()
self.view.addSubview((_designContentViewController?.view)!)
_designContentViewController?.view.isHidden = true
_designContentViewController?.view.backgroundColor = UIColor.white
}
return _designContentViewController
}
set {
_designContentViewController = newValue
}
}
答案 2 :(得分:2)
你分两步走。您使用_states等存储属性,其中包含可选数组。然后你有一个计算属性状态,它访问_states可选数组,并返回unwrapped值或首先加载_states。