Swift 错误:无法将 'Character' 类型的值转换为预期的参数类型 'Unicode.Scalar'



我是 Swift 的新手,在下面对这个函数有问题。我使用的是 SWIFT 5/Xcode 11.3。 该函数旨在删除元音之前的任何字母。 例如,"Brian"将返回"ian","Bill"将返回"ill"等。我在下面的 2 行中收到错误。

import Foundation
func shortNameFromName(_ name: String) -> String {
// Definition of characters
let vowels = CharacterSet(charactersIn: "aeiou")
var shortName = ""
let start = name.startIndex
// Loop through each character in name
for number in 0..<name.count {
// If the character is a vowel, remove all characters before current index position
if vowels.contains(name[name.index(start, offsetBy: number)]) == true { //**ERROR: Cannot convert value of type 'Character' to expected argument type 'Unicode.Scalar'**
var shortName = name.remove(at: shortName.index(before: shortName.number)) //**ERROR: Cannot use mutating member on immutable value: 'name' is a 'let' constant**
}
}
//convert returned value to lowercase
return name.lowercased()
}
var str = "Brian" // Expected result is "ian"
shortNameFromName(str)

您可以在字符串 "aeiou" 不包含字符的情况下使用 collection 的方法func drop(while predicate: (Character) throws -> Bool) rethrows -> Substring并返回一个子字符串:

func shortName(from name: String) -> String { name.drop{ !"aeiou".contains($0) }.lowercased() }
shortName(from: "Brian")  // "ian"    
shortName(from: "Bill")   // "ill"

关于代码中的问题,通过下面的代码检查注释:

func shortName(from name: String) -> String {
// you can use a string instead of a CharacterSet to fix your first error
let vowels =  "aeiou"
// to fix your second error you can create a variable from your first parameter name
var name = name
// you can iterate through each character using `for character in name`
for character in name {
// check if the string with the vowels contain the current character
if vowels.contains(character) {
// and remove the first character from your name using `removeFirst` method
name.removeFirst()
}
}
// return the resulting name lowercased
return name.lowercased()
} 
shortName(from: "Brian")  // "ian"

最新更新