gpt4 book ai didi

ios - NumberFormatter 只能写在闭包中

转载 作者:行者123 更新时间:2023-11-28 12:18:53 25 4
gpt4 key购买 nike

在阅读 The Big Nerd Ranch Guide 这本书时,我发现其中一章中的一段话要求您创建 NumberFormatter 的实例。一切都按预期工作,但我注意到格式化程序是使用 closure 创建的:

class ConversionViewController: UIViewController {
let numberFormatter: NumberFormatter = {
let nf = NumberFormatter()

nf.numberStyle = .decimal
nf.minimumFractionDigits = 0
nf.maximumFractionDigits = 1

return nf
}()

func updateCelsiusLabel() {
if let celsiusValue = celsiusValue {
celsiusLabel.text = numberFormatter.string(from: NSNumber(value: celsiusValue.value))
} else {
celsiusLabel.text = "???"
}
}
}

出于好奇,我尝试在闭包之外创建这个格式化程序,例如:

let nf = NumberFormatter()

nf.numberStyle = .decimal
nf.minimumFractionDigits = 0
nf.maximumFractionDigits = 1

但是得到了错误提示

Expected declaration

我的问题是:

  1. 为什么不能在闭包外创建 NumberFormatters案例?
  2. () 结尾的圆括号代表什么关闭?我的猜测是它是自调用的,但为什么需要这样呢?

到目前为止,我从未见过以这种方式编写的闭包。 Apple 文档中有什么解释这个的吗?

最佳答案

NumberFormatter 以及闭包实例化在这里是一个转移注意力的问题:问题是您试图直接在类型声明的范围(尽管您未能向我们展示您的所有代码确实包含在类型定义的范围内),但超出了例如实例函数或初始化器。

比较:

struct Foo {
var a = 1
a = 2 // Error: expected declaration
}

一个编译示例是:

struct Foo {
var a = 1
mutating func mutateMe() {
a = 2 // OK
}
}

至于你的问题2):括号 () 用于执行闭包的一次调用,其中闭包的返回用于实例化nf。如果您没有调用它,那么 nf 将是 () -> NumberFormatter 类型的闭包,而不是 NumberFormatter 的实际实例。比较:

struct Foo {
let a: Int = {
var a = 1
a = 2
return a
}() // instantiate 'a' of Foo by _once-only
// invoking a specified closure_.
}

比较同一概念但在类型声明/定义之外:

// this is a closure
let aClosure: () -> Int = { _ in return 42 }

// this is an invokation of a closure
// (discarding the result)
_ = aClosure()

// this is also an invokation of a closure
let num = { _ in return 42 }() // 'num' inferred to Int

关于ios - NumberFormatter 只能写在闭包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45485014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com