Ios 在Swift 3.0中使用rangeOfCharacter

Ios 在Swift 3.0中使用rangeOfCharacter,ios,swift,Ios,Swift,我正在尝试使用rangeOfCharacter创建应用程序,但无法理解其文档: func rangeOfCharacter(from: CharacterSet, options: String.CompareOptions, range: Range<String.Index>?) -Finds and returns the range in the String of the first character from a given character set found

我正在尝试使用rangeOfCharacter创建应用程序,但无法理解其文档:

func rangeOfCharacter(from: CharacterSet, options: 
String.CompareOptions, range: Range<String.Index>?)

-Finds and returns the range in the String of the first character from 
a given character set found in a given range with given options.

非常感谢您的帮助。为新手的错误道歉

将此代码与正则表达式一起使用,问题就解决了

改进 测试

debugPrint(self.shortNameFromName(name: "yhcasid")) //test1
debugPrint(self.shortNameFromName(name: "ayhcasid")) //test2
debugPrint(self.shortNameFromName(name: "I hate Swift ranges. But hopefully things will get better with Swift 4.

let name = "Michael"
var shortName = name.lowercased()
let vowels = "aeiou"
let vowelSet = CharacterSet(charactersIn: vowels)

let stringSet = shortName
if let range = stringSet.rangeOfCharacter(from: vowelSet, options: String.CompareOptions.caseInsensitive) 
{
    let startIndex = range.lowerBound

    let substring = name.substring(from: range.lowerBound)
    print(substring)
}
debugPrint(self.shortNameFromName(名称:“yhcasid”)//test1
debugPrint(self.shortNameFromName(名称:“ayhcasid”)//test2

debugPrint(self.shortNameFromName)(name:“我讨厌Swift范围。但希望Swift 4能让事情变得更好

func shortNameFromName(name: String) -> String {
    return String(name.characters.drop(while: {!"aeiou".characters.contains($0)}))
}

您正在向方法传递完全错误的参数

rangeOfCharacter
接受3个参数。您正确地传递了字符集,但传递的最后两个参数没有意义。您应该传递一组选项作为第二个参数,而不是传递字符串。第三个参数应该是
范围
,但您传递了
子字符串的返回值ing
呼叫

我认为
rangeOfCharacter
不适合这里。有很多更好的方法可以做到这一点。例如:

func shortNameFromName(name: String) -> String {
var shortName = name.lowercased()
let newstring = shortName
let vowels: [Character] = ["a","e","i","o","u"]
for i in shortName.lowercased().characters {
    if vowels.contains(i) {
        break
    }
    else {
        shortName =  shortName.replacingOccurrences(of: "\(i)", with: "")
    }

}

if shortName != "" {
    return shortName
}
else
{
    return newstring
}
Swift 3 在此处替换您的代码


您获得的输出与使用非直观的Swift范围相比,我更喜欢这个答案。另一方面,我不喜欢您使用Objective-C
NSString
对象。请尝试
shortNameFromName(名称:@MartinR很好地抓住了第一个问题,NSString说它的长度是5,而字符串说它的长度是4。如何解决这个问题?你必须传递NSString长度,而不是Swift字符串计数,比较。@MartinR谢谢你教我一些新东西,+1在你的链接回答中你可能想编辑这个:
字符串。characterView
没有名为drop
@MichaelDautermann我在操场上尝试了这个方法,它编译并产生了预期的结果。
drop
是在
Collection
中声明的,哪个
CharacterView
符合,对吗?或者你不是在使用Swift 3吗?我正在使用Xcode 8.2和操场,我的自动完成显示我
dropFirst
>还有
dropLast
characters
之后,但是没有
drop
。哦,如果你说它对你有效,也许对O.P.也有效。@MichaelDautermann:
drop(while:)
是在Swift 3.1(Xcode 8.3.3)中添加的。@Martinar编辑。
func shortNameFromName(name: String) -> String {
    return String(name.characters.drop(while: {!"aeiou".characters.contains($0)}))
}
func shortNameFromName(name: String) -> String {
var shortName = name.lowercased()
let newstring = shortName
let vowels: [Character] = ["a","e","i","o","u"]
for i in shortName.lowercased().characters {
    if vowels.contains(i) {
        break
    }
    else {
        shortName =  shortName.replacingOccurrences(of: "\(i)", with: "")
    }

}

if shortName != "" {
    return shortName
}
else
{
    return newstring
}