【问题标题】:Which declaration to use in swift [duplicate]在swift中使用哪个声明[重复]
【发布时间】:2014-12-15 22:22:07
【问题描述】:

我真的不知道如何在 Swift 中声明我的变量,我有四个选择:

var value = 0.0 // I know this one declares value as a Double with the number 0.0
var value: Float = 0.0 // This one declares value as a Float with the number 0.0
var value: Float? // I really don't get the difference between this
var value: Float! // and this, I just know that both of them are used to declare a variable without a value, am I right ?

我只想声明一个浮点数而不赋予一个值,最好的方法是什么?

【问题讨论】:

  • 所有这些变量都在 SKScene 类中声明,所以我猜没有局部变量?没有在这个类的函数中,而是在类的开头,在函数声明之前。

标签: variables swift declaration


【解决方案1】:

Float? 是可选的。 Float! 是一个隐式展开的可选项。有关后者的详细信息,请参阅The Swift Programming Language: The BasicsImplicitly Unwrapped Optionals 部分,其中说:

[Optionals] 表示允许常量或变量“无值”。可选项可以使用 if 语句检查值是否存在,并且可以使用可选绑定有条件地展开以访问可选项的值(如果存在)。

有时从程序的结构中可以清楚地看出,在第一次设置该值之后,可选项将始终具有一个值。在这些情况下,无需在每次访问可选值时检查和解开它的值,因为可以安全地假定它始终具有值。

这些类型的可选项被定义为隐式展开的可选项。通过在要设为可选的类型之后放置感叹号(字符串!)而不是问号(字符串?)来编写隐式展开的可选。

当一个可选项的值在第一次定义后立即确认存在并且可以肯定地假定在此后的每个点都存在时,隐式展开的可选项很有用。在 Swift 中,隐式解包选项的主要用途是在类初始化期间,如 Unowned References 和 Implicitly Unwrapped Optional Properties 中所述。

隐式解包的可选项是幕后的普通可选项,但也可以像非可选值一样使用,而无需在每次访问时都解包可选值。

您描述value 将是一个类属性。如果这是您始终在 init 方法中设置的 Float,那么您根本不需要将其设为可选,因此您可以使用第二种语法。如果它是一个在任何时候都可能是nil 或非nil 的变量,那么您可以将其设为可选(您的第三种语法)。但是如果它是一个你不能在init 中设置的变量,但是一旦你设置了它,从那时起它通常总是有一个值,你可能倾向于隐式展开的可选(你的第四种语法)。

【讨论】:

    【解决方案2】:

    你有更多的选择!就在我的脑海中,你也可以这样做:

    var value = Float(0)
    lazy var value: Float = 1
    var value = {0 + 0 as Float}()
    

    等等等等。无论如何:我假设这是实例变量;你的问题并不清楚。

    让我们先谈谈可选参数:你应该(如果可能的话)避免使用可选参数,除非你正在处理一个值可能显式丢失的情况;例如,您有时只实例化一个视图,或者一个并不总是设置的委托。在我看来(在比我更聪明的人看来;请参阅 github 自己的 Swift Style Guide),您应该尽可能少地使用隐式展开的选项(value: Float!)。我们经常在 Apple 的 API 中看到它们,因为这些 API 是从用 Obj-C 编写的框架中采用的,它使用 nil 的方式不同。唯一应该是隐式展开可选的情况是它可以init之后设置,并且它永远不会为零;我们最常看到它的地方是从故事板加载的视图中,因为这发生在视图控制器初始化之后。

    对于其他模式:如果您不想设置初始值,我认为初始化为零是一个很好、清晰的模式。肯定比使用可选项更好,除非您非常明确地想要传达这个值在将来的某个时候可能不会保持任何值。

    如果您要处理比浮点数更重的东西(比如实例化昂贵的对象),我更喜欢lazy 模式,因为如果您在分配给它之前从不访问该值,它将永远不会被实例化。目前有一些compiler issues 在这方面,目前(XCode 6.1.1),所以暂时最好使用可选;无论如何,lazy 在幕后使用了可选项。

    【讨论】:

    • 在 C++ 中使用不带变量的情况下,“1.0f”的表现如何
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多