2

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

let letterCharacters = NSCharacterSet()

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

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 对象?

4

2 回答 2

4

苹果文档

class var letters: CharacterSet

一个字符集,包含 Unicode 通用类别 L* 和 M* 中的字符。

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

变量类型的快速入门。

  • CharacterSet.letters例如,可以通过使用类名调用变量来访问类变量
  • 一个实例变量需要先实例化它的类才能被访问,characterSet.inverted这就是一个例子

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

于 2017-10-26T19:38:06.740 回答
3

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

您可以将此与枚举与案例进行比较,但这有点不同,因为您获得了实际值,而且......只是不是案例。静态变量和类变量的区别在于类变量可以被覆盖,静态不能。

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

如果您打开 Playground,您可以为自己创建一个很好的示例:

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

请参阅类型方法。

于 2017-10-26T19:46:31.627 回答