为什么我在使用它之前不必先实例化 NSCharacterSet 对象?

How come I didn't have to instantiate the NSCharacterSet object first before using it?

我正在学习有关委托和协议的教程,同时使用 UITextField 对象。在本教程中,我注意到我不必先通过键入

来实例化 NSCharacterSet 对象
let letterCharacters = NSCharacterSet()

本教程的代码通过直接访问 NSCharacterSet 的字母变量来工作,这令人惊叹。我假设对象在使用或引用它们之前总是需要先实例化。这是有效的完整功能:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let existingTextHasDecimalSeperator = textField.text?.range(of: ".")
        let replacementTextHasDecimalSeperator = string.range(of: ".")
        let letterCharacters = NSCharacterSet.letters
        let foundCharacter = string.rangeOfCharacter(from: letterCharacters)


        if existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeperator != nil {
            return false
        } else if foundCharacter != nil {
            return false
        } else {
            return true
        }
    }

为什么我可以直接使用 NSCharacterSet.letters 而不是先创建一个 NSCharacterSet 对象?

来自Apple documentation

class var letters: CharacterSet

A character set containing the characters in Unicode General Category L* & M*.

这里的关键部分是该定义的 class 部分。如果它是一个 class 变量,则不需要使用 NSCharacterSet().

实例化对象

变量类型快速入门。

  • 一个class变量可以简单地通过调用带有class名称的变量来访问CharacterSet.letters,例如
  • 一个实例变量需要先实例化它的 class 才能被访问,characterSet.inverted 就是这样的一个例子

通常,class 变量永远不会改变,因此不需要维护状态。实例变量可能会。

如果您仔细查看文档(我更喜欢使用跳转到定义而不是苹果文档),您会发现 class NSCharacterSet 确实提供了 class 变量

您可以将其与带案例的枚举进行比较,但这有点不同,因为您获得的是实际值,而且……只是不是案例。 static 和 class 变量之间的区别是 class 变量可以被覆盖,而 static 不能。

但要回答你的问题:你可以直接访问这些变量,因为它们是静态的。

如果你打开游乐场,你可以为自己创造一个很好的例子:

class Car {

// This might be bad example, but you will see on next lines...
  class var brand: String { return "Volkswagen" }

  /// Because Volkswagen... :D 
  class func emitSmog() {
     // Do wonderful things to earth and basically product rainbows
    }
}

// You don't need to create the Car instance 
print(Car.brand)

// Again, this function is static, so you don't need to construct anything...
Car.emitSmog()

请参考苹果文档:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html

参见类型方法。