NumberFormatter只能在闭包

时间:2017-08-03 13:01:35

标签: ios swift closures number-formatting

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

但得到的错误是

  

预期声明

我的问题是:

  1. 为什么不能在关闭之外创建NumberFormatters。{ 情况?
  2. 括号()代表什么? 关闭?我的猜测是它的自我调用,但为什么需要?
  3. 到目前为止,我从未见过用这种方式写过的闭包。 Apple文档中有什么可以解释这个吗?

3 个答案:

答案 0 :(得分:1)

NumberFormatter以及闭包实例化在这里是一个红色的鲱鱼:问题是你是否试图直接在一个类型的范围内更改实例属性(nf)声明(尽管您未能向我们证明您的所有代码确实都包含在类型定义的范围内),但超出了范围实例函数或初始化函数。

与:比较:

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

编译示例如下:

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

至于你的问题 2):parantheses ()用于执行闭包的一次性调用,其中闭包的返回用于实例化{{1 }}。如果您没有调用它,那么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_.
}

答案 1 :(得分:1)

第一个答案:我在Playground中测试您的代码段并且它没有显示任何错误。我认为你可能做错了与PYTHONIOENCODING="utf8" python script.py 无关的错误。

NumberFormatter

第二回答:闭包的结束大括号告诉Swift立即执行闭包。如果省略这些括号,则尝试将闭包本身分配给属性,而不是闭包的返回值。 App Doc

答案 2 :(得分:0)

在这种情况下,

let nf = NumberFormatter() 是一个实例属性。这本身就是一个拥有自己财产的阶级。当你宣布

   var imageOrienttion = 0
   switch (YourUIImage.imageOrientation) {
    case UIImageOrientation.up:
        imageOrienttion = 1
        break;
    case UIImageOrientation.down:
        imageOrienttion = 3
        break;
    case UIImageOrientation.left:
        imageOrienttion = 8
        break;
    case UIImageOrientation.right:
        imageOrienttion = 6
        break;
    case UIImageOrientation.upMirrored:
        imageOrienttion = 2
        break;
    case UIImageOrientation.downMirrored:
        imageOrienttion = 4
        break;
    case UIImageOrientation.leftMirrored:
        imageOrienttion = 5
        break;
    case UIImageOrientation.rightMirrored:
        imageOrienttion = 7
        break;
   }
   imageOptions[CIDetectorImageOrientation] = imageOrienttion

nf适合你,但有默认属性。并且您不能在声明中设置其属性。你会收到这个错误。

enter image description here