我正在开发一个自定义的NSFormatter。
我需要逐步验证用户输入...我想通过isPartialStringValid:
检查字符串是否只包含允许的字符“0123456789ABCDEF”。
我该如何验证这种情况?是否有一种方法可以使用NSString函数来检查字符串是否只包含一些字符?
答案 0 :(得分:17)
这种方法适合你吗?
NSString *string = @"FF";
NSCharacterSet *chars = [[NSCharacterSet
characterSetWithCharactersInString:@"0123456789ABCDEF"] invertedSet];
BOOL isValid = (NSNotFound == [string rangeOfCharacterFromSet:chars].location);
答案 1 :(得分:3)
您可以创建包含允许字符(NSCharacterSet
)的自定义+ characterSetWithCharactersInString:
,然后使用rangeOfCharacterFromSet:
对其进行测试。如果返回的范围等于字符串的整个范围,则表示匹配。
另一个选项是与NSRegularExpression
匹配。
示例代码Swift 3:
func isValidHexNumber() -> Bool {
let chars = CharacterSet(charactersIn: "0123456789ABCDEF")
guard uppercased().rangeOfCharacter(from: chars) != nil else {
return false
}
return true
}
答案 2 :(得分:3)
在 swift 2.1 中,您可以通过以下方式扩展String:
//wrapper to an observable that requires accept/cancel
ko.protectedObservable = function(initialValue) {
//private variables
var _actualValue = ko.observable(initialValue),
_tempValue = initialValue;
//computed observable that we will return
var result = ko.computed({
//always return the actual value
read: function() {
return _actualValue();
},
//stored in a temporary spot until commit
write: function(newValue) {
_tempValue = newValue;
}
}).extend({ notify: "always" });
//if different, commit temp value
result.commit = function() {
if (_tempValue !== _actualValue()) {
_actualValue(_tempValue);
}
};
//force subscribers to take original
result.reset = function() {
_actualValue.valueHasMutated();
_tempValue = _actualValue(); //reset temp value
};
return result;
};
答案 3 :(得分:3)
extension String {
func isHexNumber() -> Bool {
self.filter(\.isHexDigit).count == count
}
}
print("text1".isHexNumber()) // false
print("aa32".isHexNumber()) // true
print("AD1".isHexNumber()) // true
答案 4 :(得分:0)
Swift one-liner,无需添加任何扩展:
myString.allSatisfy(\.isHexDigit)
在您可以使用之前,Swift 5.2 中引入了使用 keypath
谓词:
myString.allSatisfy({ $0.isHexDigit })