Ios 为什么我没有';在使用NSCharacterSet对象之前,是否不必先实例化它?

Ios 为什么我没有';在使用NSCharacterSet对象之前,是否不必先实例化它?,ios,swift,nscharacterset,Ios,Swift,Nscharacterset,我正在学习使用UITextField对象时有关委托和协议的教程。在教程中,我注意到我不必首先通过键入来实例化NSCharacterSet对象 let letterCharacters = NSCharacterSet() 本教程的代码通过直接获取NSCharacterSet的letters变量来工作,这非常令人兴奋。我假设在使用或引用对象之前,总是需要先实例化对象。以下是有效的完整功能: func textField(_ textField: UITextField, shouldChange

我正在学习使用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对象?

来自:

包含Unicode常规类别中的字符的字符集 L*&M*

这里的关键部分是该定义的类。如果是类变量,则不需要使用
NSCharacterSet()
实例化对象

关于变量类型的快速入门

  • 只需使用类名
    CharacterSet调用变量即可访问类变量。例如,字母
  • 实例变量需要先实例化它的类,然后才能访问它,
    characterSet.inversed
    就是一个例子

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

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

您可以将其与带有案例的枚举进行比较,但这有点不同,因为您得到了实际值,并且。。。只不过不是案例。静态变量和类变量的区别在于类变量可以被重写,而静态变量不能

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

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

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()
请参阅苹果的文档:


请参阅类型方法。

您是否查阅了文档?是一个类属性,返回
CharacterSet
@MartinR的一个实例,好的!类属性就是这样做的吗?为了理解类属性,我读了无数的博客和文档,但我想从你的角度来理解它。哦,好的!类似于UIColor.green@CodeBender@Q.A.Neuro.Tech是的,因为在这种情况下,绿色永远不会改变。如果你用“大众汽车”代替“福特”,用emitSmog()代替makeNoise(),这将是有史以来最好的答案:)@CodeBender一切皆有可能:D:D
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()