Xcode中Character类型无isUppercase等成员报错求助
解决Character属性报错:
Value of type 'Character' has no member 'isUppercase'等问题 我碰到过好几次这种情况,大概率是下面几个原因之一,咱们一步步排查解决:
1. 你的Swift版本太低了
这些Character的属性(isNumber/isUppercase/isCurrencySymbol等)是Swift 5.0及以上版本才正式添加到Character类型上的。如果你的项目还在使用Swift 4.x或更早版本,Xcode肯定会报找不到这些成员的错误。
解决方法:
打开你的Xcode项目,选中主目标,进入Build Settings,搜索「Swift Language Version」,把版本设置为5.0或更高(建议选最新兼容的版本)。
2. 项目里自定义了同名的Character类型
如果你的项目中自己定义了一个struct、enum或者class命名为Character,它会覆盖系统自带的Character类型,导致系统的那些属性无法被识别。
解决方法:
- 全局搜索项目里的
Character定义,把自定义的类型改名(比如改成CustomCharacter); - 或者在代码里明确使用系统类型的全名:
Swift.Character,比如把循环里的char类型指定为Swift.Character。
3. 你的代码没有放在String的扩展里
从你的代码来看,这些方法(比如containsNumber())应该是要给String类型添加的扩展方法,但如果没有包裹在extension String { ... }里,self的类型可能不是String,迭代出来的char也就不是系统的Character。
解决方法:
把所有方法包裹在String扩展中,顺便帮你简化了代码(用String的contains(_:)方法替代循环,更简洁高效):
extension String { func containsNumber() -> Bool { return contains { $0.isNumber } } func containsCapital() -> Bool { return contains { $0.isUppercase } } func containsLowercase() -> Bool { return contains { $0.isLowercase } } func containsSpecialCharacters() -> Bool { return contains { $0.isPunctuation || $0.isSymbol || $0.isCurrencySymbol } } func containsEnoughCharacter(numberOfCharacters : Int) -> Bool { return count >= numberOfCharacters } }
临时替代方案(如果无法升级Swift版本)
如果因为某些原因不能升级Swift版本,可以通过Character的unicodeScalars属性来获取对应的判断:
// 替代isNumber char.unicodeScalars.first?.isNumber == true // 替代isUppercase char.unicodeScalars.first?.isUppercase == true // 其他属性同理,比如isPunctuation char.unicodeScalars.first?.isPunctuation == true
内容的提问来源于stack exchange,提问作者Mathias Erligmann
相关产品推荐
相关产品推荐

