当前位置: 首页 > 知识库问答 >
问题:

在swift中使用哪种声明[副本]

滑乐逸
2023-03-14

我真的不知道如何在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 ?

我只想声明一个float而不指定一个值,最好的方法是什么?

共有2个答案

邢宏浚
2023-03-14

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

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

等等,等等,不管怎样:我假设这是变量的例子;你的问题不清楚。

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

对于其他模式:如果不想设置初始值,我认为初始化为零是一个好的、清晰的模式。当然,这比使用可选值要好,除非您特别希望在将来的某个时刻传达该值可能不具有任何价值。

如果您处理的是比浮点数更重的东西(例如实例化成本很高的对象),我更喜欢模式,因为如果您在分配给它之前从不访问该值,它将永远不会被实例化。目前围绕此存在一些编译器问题(XCode 6.1.1),因此暂时最好使用选项;无论如何,在幕后使用选项。

韩寒
2023-03-14

Float?是可选的。Float!是隐式展开的可选项。有关后者的详细信息,请参阅Swift编程语言:基础的隐式展开选项部分,其中说:

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

有时,从程序的结构可以清楚地看出,在第一次设置该值之后,一个可选项将始终具有一个值。在这些情况下,消除每次访问可选项时检查和打开其值的需要是很有用的,因为可以安全地假设它一直都有一个值。

这些类型的选项被定义为隐式展开的选项。您可以通过在要使其成为可选的类型之后放置感叹号(String!)而不是问号(String?)来编写隐式展开的可选项。

当一个可选项的值在第一次定义该可选项之后立即被确认存在时,隐式展开的可选项是有用的,并且可以肯定地假设该可选项在此后的每一点上都存在。Swift中隐式展开选项的主要用途是在类初始化期间,如无主引用和隐式展开可选属性中所述。

隐式展开的可选项在幕后是正常的可选项,但也可以像非可选值一样使用,而无需在每次访问可选值时展开它。

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

 类似资料:
  • 问题内容: 在Swift中应该如何声明和使用位字段? 像这样声明一个枚举确实可行,但是尝试对2个值进行或运算将无法编译: 我研究了Swift如何导入Foundation枚举类型,它是通过定义符合协议的a 来实现的: 而协议是: 但是,没有关于该协议的文档,我无法自己弄清楚如何实现它。此外,还不清楚这是实现位字段的官方Swift方法,还是这仅仅是Objective- C桥如何表示它们的方式。 问题答

  • 问题内容: 如果我在Swift中需要自定义类型,可以,该怎么办?(类似于闭包语法typedef) 问题答案: 使用关键字代替

  • 问题内容: 假设我有一个通用类: 这些声明之间有什么区别? 问题答案: 没有泛型参数就不能存在泛型类型,因此省略泛型类型意味着您希望编译器推断该类型。 在这种情况下,要推断的逻辑类型为。 请注意,这仅适用于您使用了内部声明。它不适用于其他泛型类。 可以在变量声明中使用类似的通用参数推断:

  • 问题内容: 我希望能够用元数据注释我的类型和方法,并在运行时读取它们。 语言参考说明了如何声明属性用法,但实际上可以声明自己的属性吗? 阅读将需要某种反射机制,我根本无法在参考文献中找到这种反射机制,因此问题的第二部分可能是- 是否可能反射。如果这些功能在Swift中不可用,是否可以用Objective-C代码完成(但在Swift实例和类型上)? 相对不相关的注释:关于将什么建模为属性以及将哪些内

  • 问题内容: 我想制作一个可以在整个应用程序中访问的自定义对象的全局数组(AppDelegate,ViewController类,TableViewController类等)。我已经研究了一种解决方法,但没有找到答案。我曾尝试将数组设置为公共范围,但是收到了编译器警告,提示当我尝试在其他文件中访问该数组时,出现错误提示 我将如何使该数组可被应用程序中的所有文件全局访问,我将在哪里实例化该数组? 问题

  • 问题内容: 我们可以在Objective-C中声明以下块。 我试图迅速做到这一点,它给错误。 错误:使用未声明的“ completionFunction” 定义: 这该怎么做? 更新: 根据@jtbandes的回答,我可以创建带有多个参数的闭包,例如 问题答案: 在对函数类型的语法是。 请注意,从Swift 3+开始,仅需在输入类型周围加上括号。