【问题标题】:Default parameters swift默认参数 swift
【发布时间】:2016-08-30 07:00:29
【问题描述】:

对于我的默认参数我应该写

func myFunc(optionA: Int? = 0)

func myFunc(optionA: Int! = 0)

哪个更可取和/或更重要的是哪个在生产中使用得更多?如果我使用Int! 而不是Int? 会发生什么?我是否仍然可以传递Intnil 或不传递参数,而不必在访问时解开参数?这样做是否被认为是惰性编程并且可能会带来潜在的内存不安全性?

【问题讨论】:

  • 0 不为零。目前尚不清楚您的问题是什么。您认为Int! 案例的好处是什么?如果它有默认值,为什么不只是 Int
  • 如果取决于上下文。但在大多数情况下,Int 参数的最佳选择是非可选的。
  • Swift 的强类型概念建议尽可能避免使用可选项。非可选类型永远不会导致应用程序在运行时崩溃。 Int无值 情况可以用 0、-1(如果有效整数为正数)或 NSNotFound 表示,这与 Int.max 相同。所以你有三个选择。如果它们都不合理,则使用可选项。
  • 一般来说,函数的可选参数(特别是如果它是 only 参数!)应该尽可能避免。当您传入nil 作为参数时,它只会使函数的 function 更加模棱两可。在这种情况下应该怎么做? (想想你的代码,就好像你对内部实现一无所知)
  • @NoodleOfDeath 选项肯定有它们的用途,并且在正确使用时非常有用。一般来说,它们对引用类型比对值类型更有意义——因为大多数值类型都相当于nil。例如Int0String""Array[] 等。另一方面,引用类型更有意义,因为nil 表示没有引用。如果这些过程具有“失败能力”的元素,可选参数也可以用作函数的返回值。还要记住,大多数 Apple API 都是用 obj-c 编写的,其中 nil 可以分配给任何对象类型。

标签: swift default-value optional-parameters


【解决方案1】:

0 不是零。在任何一种情况下,您都会使 optionA 的值为 0,而不是 nil

这里的正确答案取决于你希望你的函数有什么样的接口。

  • 如果您希望调用者能够传递Intnil 或根本不传递参数,那么optionA 应该是Int? 类型。
  • 如果您希望调用者能够传递Int,根本不传递参数,但不是nil,那么optionA 应该是Int 类型。

【讨论】:

  • 如果我改用Int! 会发生什么?我是否仍然可以实现此功能而不必在访问时解开参数?这样做是否被视为惰性编程并存在潜在的内存不安全性?
  • 我不在我的 Mac 附近进行测试,但如果我没记错的话:Int 类型将阻止 nil 被传入(通过编译器类型错误),@ 987654335@ 类型将允许nil 传入,但需要手动解包,Int! 将允许nil 传入,但会使宇宙爆炸。
  • 回答你的后一个问题:是的,滥用强制展开运算符被认为是懒惰的,并且几乎是任何人提到的不良 Swift 实践的第一个例子。内存仍然是安全的,因为强制解开 nil 可选项总是会导致运行时错误(防止任何危险的内存操作成为可能)
【解决方案2】:

如果我不提供值或为参数提供 nil,则其默认值变为 0。

这是一个非常奇怪的要求,可能表示设计错误。但是,实现起来很简单。

func myFunc(optionA: Int? = nil) {
    let a = optionA ?? 0
    // ...continue to use a...
}

也就是说,这几乎可以肯定是一个损坏的 API。举一个更具体的例子来说明您正在解决的问题是 func myFunc(a: Int) 无法解决的(这应该是您的强烈偏好,除非您有充分的理由去做其他事情)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多