为什么我在使用它之前不必先实例化 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 对象?
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()
请参考苹果文档:
参见类型方法。
我正在学习有关委托和协议的教程,同时使用 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 对象?
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()
请参考苹果文档:
参见类型方法。