Swift中switch判断元音代码可用,转if语句报错如何正确改写?
解决Swift中Character扩展isVowel方法的if语句转换问题
嘿,这个问题我刚学Swift的时候也踩过坑!你原来的if写法出错,是因为Swift的if条件必须是一个布尔值(Bool),而你直接写"a", "e", "i", "o", "u"这种逗号分隔的字符串,Swift根本不知道怎么把它转换成判断条件,所以才会报“cannot convert type String to Bool”的错误。
下面给你两种简洁且正确的转换方式:
方式一:用集合(Set)判断(推荐)
把所有元音字符放进一个Set里,然后用contains(_:)方法判断当前字符是否在集合中——这个方法会直接返回Bool值,完美适配if或者直接return的需求:
extension Character { func isVowel() -> Bool { // 把大小写元音都放进集合里 let vowels: Set<Character> = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"] return vowels.contains(self) } }
方式二:统一大小写后判断
如果不想重复写大小写字符,可以先把当前字符转成小写(或大写),再判断是否在小写元音集合里:
extension Character { func isVowel() -> Bool { let lowercasedChar = self.lowercased() let vowels = ["a", "e", "i", "o", "u"] return vowels.contains(lowercasedChar) } }
为什么你之前的尝试没成功?
你提到加了self或者self.asciiValue没解决,可能是因为你写的条件逻辑不对。比如如果写成:
// 错误示例:逗号在Swift里是逻辑与,不是逻辑或! if self == "a", self == "e" { ... }
这种写法要求字符同时等于"a"和"e",显然不可能。如果非要用多个||(逻辑或)来写,也能运行,但代码会非常冗长:
// 能运行但不推荐的写法 extension Character { func isVowel() -> Bool { if self == "a" || self == "e" || self == "i" || self == "o" || self == "u" || self == "A" || self == "E" || self == "I" || self == "O" || self == "U" { return true } else { return false } } }
这种写法不仅不美观,后期维护也麻烦,所以还是推荐用集合的方式。
内容的提问来源于stack exchange,提问作者LegalFingers
相关产品推荐
相关产品推荐

