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

问题描述 投票:0回答:1

我正在尝试在 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])];
}
swift objective-c string nsrange
1个回答
2
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.