Swift是NSRange.location和NSRange.length的替代品吗?

pnwntuvh  于 2023-09-30  发布在  Swift
关注(0)|答案(1)|浏览(110)

我正在尝试在Swift中找到NSRange.locationNSRange.length的替代品。
例如sip: [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)
我试着从中提取名字。我可以使用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])];
}
9rnv2umw

9rnv2umw1#

NSString中的range方法类似,Swift Strings也有一个range方法,可以在字符串中查找特定的子字符串。
您可以通过在找到的“sip:“和“@"范围的lowerBoundupperBound上使用..<运算符来创建所需的范围。
然后,您可以将范围传递给String下标,以获得Substring形式的结果。
如果我没理解错的话,你想要的逻辑是:

func parseNameFrom(_ string: 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
    }
}

print(parseNameFrom("sip:[email protected]")!)

相关问题