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

What is Swift alternative to NSRange.location and NSRange.length?

提问人:Sagar D 提问时间:9/15/2023 最后编辑:RanoiaetepSagar D 更新时间:9/19/2023 访问量:62

问:

我正在尝试在 Swift 中找到一些替代品。NSRange.locationNSRange.length

例如,我有一个字符串sip:[email protected]

我正在尝试从中提取名称。我可以使用 String 中的方法来做到这一点。但我想知道是否可以使用类似于目标 C 的范围来完成。componentsSeperatedBy

我已经有旧的遗留 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 字符串 nsrange

评论

0赞 vadian 9/15/2023
代码的免费翻译可以在 String 扩展中利用 Swift Regex: 。结果为类型let name = self.firstMatch(of: /(?:sips?:)?([^@]+)@/)?.output.1Substring?
2赞 Willeke 9/16/2023
不要转换旧的遗留 Objective-C 代码。询问如何在 Swift 中提取名称。

答:

3赞 Sweeper 9/15/2023 #1

与 中的方法类似,Swift 也有一个 range 方法,用于查找字符串中的特定子字符串。rangeNSStringStrings

您可以通过在找到的“sip:”和“@”范围上使用运算符来创建所需的范围。..<lowerBoundupperBound

然后,可以将范围传递给下标,以 .StringSubstring

如果我理解正确,你想要的逻辑是:

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]")!)

评论

0赞 Alexander 9/19/2023
嘿 Sweeper,只是一些小建议:一些 guard-let 可以帮助解开其中的一些代码。String