Ios 在Swift 3.0中使用rangeOfCharacter
我正在尝试使用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
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-CNSString
对象。请尝试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
}