null-coalescing运算符的简写和可重新生成属性的赋值?

时间:2016-08-29 19:27:37

标签: swift swift2 null-coalescing-operator

在我的属性中,我在返回属性之前为其赋值。下次访问它时,它正在检查它是nil并再次分配它还是只返回实例。

这就是我现在这样做的方式:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    if _myProp == nil {
        _myProp = MyInstance()
    }
    return _myProp!
}

这看起来非常不喜欢Swift,并希望有一种更优雅的方式来做到这一点。例如,在C#我可以这样做:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    return _myProp ?? (_myProp = MyInstance())
}

我试图允许该属性重新生成,以便可以取消分配,但下次访问它时,它将再次创建该实例。

Swift中有这样的东西吗?

3 个答案:

答案 0 :(得分:1)

Swift确实有null合并操作符,所以你可以非常接近你的C#代码:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    mutating get {
        _myProp = _myProp ?? MyInstance()
        return _myProp!
    }
}

Swift中的赋值运算符的计算结果为Void,而不是指定的值,因此您无法将其用于return语句。

答案 1 :(得分:1)

Swift中的类似符号将是:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    return _myProp ?? {_myProp = MyInstance(); return _myProp!}()
}

但是我不知道它看起来更像Swift或者更常见...

如果您经常使用这种模式,最好只创建一个全局函数来帮助,如下所示:

func retrieve<T>(_ property:inout T?, withDefault value:T)->T {
    if property == nil {
        property = value
    }
    return property!
}

然后您的代码变为:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    return retrieve(&_myProp, withDefault:MyInstance())
}

根据我的经验,与自定义操作符或重载相比,其他人更容易理解,阅读和调试函数。

答案 2 :(得分:0)

根据你的回复,我认为这是“最快”的方式:

ID_CAP_LOCATION

它可能比你想要的更冗长,但作为交换,我认为它非常清楚,它并没有强制 - 解开任何选项。