为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?

为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?

宝慕林4294392 2019-06-28 15:22:23
为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?为什么要创建一个“隐式非包装可选”而不是只创建一个常规变量或常量?如果您知道可以成功地打开它,那么为什么首先创建一个可选项呢?例如,为什么:let someString: String! = "this is the string"比:let someString: String = "this is the string"如果“选项表示一个常量或变量被允许具有‘无值’,但”有时从程序的结构中可以清楚地看到,在第一次设置该值之后,可选项总是有一个值“,那么从一开始将其作为可选值有什么意义呢?如果你知道一个可选的东西总是有一个值,那不是说它不是可选的吗?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

考虑一个对象的情况,它在构造和配置对象时可能具有零属性,但在构造和配置过程中是不可变的和非零的(NSImage通常是这样处理的,尽管在它的情况下,有时变异仍然是有用的)。隐式拆解选项将很好地清理其代码,安全损失相对较低(只要有一个保证,它就安全了)。

(编辑)但要清楚:常规的选项几乎总是更好。


查看完整回答
反对 回复 2019-06-28
?
MM们

TA贡献1886条经验 获得超2个赞

在我描述隐式展开选项的用例之前,您应该已经了解了SWIFT中的选项和隐式未包装选项。如果你没有,我建议你先读我关于选拔赛的文章

何时使用隐式未包装的可选项

有两个主要原因,一个是创建隐式解包装的可选项。所有这些都与定义一个在nil否则,SWIFT编译器将总是强制您显式地打开一个可选的包。

1.在初始化过程中不能定义的常量

每个成员常量必须在初始化完成之前具有一个值。有时,在初始化期间不能用其正确的值初始化一个常量,但仍然可以保证它在被访问之前具有一个值。

使用可选变量可以避免此问题,因为可选变量将自动初始化为nil它最终包含的值仍然是不变的。但是,不断地展开变量可能会带来痛苦,因为您知道这个变量肯定不是零。隐式解包选项实现了与可选项相同的好处,增加的好处是不必在任何地方显式地展开它。

这方面的一个很好的例子是,在加载视图之前,无法在UIView子类中初始化成员变量:

class MyView: UIView {
    @IBOutlet var button: UIButton!
    var buttonOriginalWidth: CGFloat!

    override func awakeFromNib() {
        self.buttonOriginalWidth = self.button.frame.size.width    }}

在这里,在视图加载之前不能计算按钮的原始宽度,但您知道awakeFromNib将在视图上的任何其他方法(初始化除外)之前调用。与其强制在类中无意义地显式地展开值,还可以将其声明为隐式未包装的可选项。

2.当应用程序无法从变量中恢复时nil

这应该是非常罕见的,但是如果您的应用程序不能继续运行,如果变量是nil当被访问时,费时费力地对其进行测试是一种浪费时间。nil..通常,如果您的应用程序要继续运行,必须有一个绝对正确的条件,则可以使用assert..隐式未包装的可选项中包含了一个Assertfornil。即使如此,如果选项为0,那么打开可选的包并使用更具描述性的断言通常是好的。

当不使用隐式未包装的可选项时

1.计算迟缓的成员变量

有时,您的成员变量不应为零,但在初始化期间不能将其设置为正确的值。一种解决方案是使用隐式未包装的可选项,但更好的方法是使用惰性变量:

class FileSystemItem {}class Directory : FileSystemItem {
    lazy var contents : [FileSystemItem] = {
        var loadedContents = [FileSystemItem]()
        // load contents and append to loadedContents        return loadedContents    }()}

现在,成员变量contents在第一次访问时才初始化。这使类在计算初始值之前有机会进入正确的状态。

注:这似乎与上面的第一条相矛盾。然而,有一个重要的区别有待作出。这个buttonOriginalWidth必须在viewDidLoad期间设置上面的内容,以防止任何人在访问属性之前更改按钮宽度。

2.其他地方

在大多数情况下,应该避免隐式未包装选项,因为如果使用错误,则整个应用程序在访问时会崩溃。nil..如果您不确定变量是否可以为零,请始终默认使用普通可选项。展开一个变量,这个变量永远不会nil当然不会很疼。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 834 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信