我正在尝试在 Swift 中找到
NSRange.location
和 NSRange.length
的替代品。
我有一个字符串,例如
sip:[email protected]
我正在尝试从中提取名称。我可以使用 String 中的
componentsSeperatedBy
方法来做到这一点。但我想知道是否可以使用类似于 Objective C 的范围来完成。
我已经有旧的 Objective C 代码,我正在尝试将其转换为 Swift。
// Extract name from sip:[email protected].....
NSString *name = nil;
NSRange rangeForSip;
NSRange rangeFor@;
rangeForSip = [self rangeOfString: @"sip:"];
if (rangeForSip.location == NSNotFound) {
//Look for sips
rangeForSip = [self rangeOfString: @"sips:"];
}
match2 = [self rangeOfString: @"@"];
if ((rangeForSip.location != NSNotFound) && ([email protected] != NSNotFound)) {
name = [self substringWithRange:NSMakeRange(rangeForSip.location + rangeForSip.length, [email protected] - (rangeForSip.location + rangeForSip.length))];
} else if ([email protected] != NSNotFound) {
// Extract name from sip:[email protected].....
name = [self substringWithRange:NSMakeRange(0, [email protected])];
}
与
range
中的 NSString
方法类似,Swift Strings
也有一个 range
方法,用于查找字符串中的特定子字符串。
您可以通过在找到的“sip:”和“@”范围的
..<
和 lowerBound
上使用 upperBound
运算符来创建所需的范围。
然后您可以将范围传递给
String
下标以获得 Substring
形式的结果。
如果我理解正确的话,你想要的逻辑是:
let rangeOfSip = string.range(of: "sip:") ?? string.range(of: "sips:")
if let rangeOfAt = string.range(of: "@") {
if let rangeOfSip {
return string[rangeOfSip.upperBound..<rangeOfAt.lowerBound]
} else {
return string[..<rangeOfAt.lowerBound]
}
} else {
return nil // can't find it
}