gpt4 book ai didi

swift - 如何计算出一个字符串中子字符串的范围,然后在另一个字符串中使用它

转载 作者:行者123 更新时间:2023-12-02 18:39:32 24 4
gpt4 key购买 nike

基本上我想要这样的东西,

NSString* foobar(NSString *input) {
// say input is "1"
NSString *string = @"0123456789";
NSString *anotherString = @"零一二三四五六七八九";

NSRange range = [string rangeOfString:input];

// return "一" here
return [anotherString substringWithRange:range];
}

我在 Swift 中尝试了同样的东西,

func foobar(input: String) -> String {
// say input is "1"
let string = "0123456789"

let range = string.range(of: input, options: .anchored)
let result = anotherString[range!]

// return "012" here
return String(result)
}
为什么?我怎样才能实现这一目标?

最佳答案

字符串(或通常是集合)索引只能与创建它们的集合一起使用。为了在另一个字符串中找到相同的位置,索引必须转换为(整数)偏移量并返回到目标字符串的索引:

func foobar(input: String) -> String? {
let s1 = "0123456789"
let s2 = "😀一二三四五六七八九";

guard let range = s1.range(of: input) else {
return nil
}
let pos = s1.distance(from: s1.startIndex, to: range.lowerBound)
let len = s1.distance(from: range.lowerBound, to: range.upperBound)
guard
let lo = s2.index(s2.startIndex, offsetBy: pos, limitedBy: s2.endIndex),
let hi = s2.index(lo, offsetBy: len, limitedBy: s2.endIndex)
else {
return nil
}
return String(s2[lo..<hi])
}

print(foobar(input: "1") as Any) // Optional("一")
print(foobar(input: "123") as Any) // Optional("一二三")
print(foobar(input: "124") as Any) // nil

只要字符串中的所有字符都使用单个 UTF-16 代码单元(因为这是 NSRange 所计数的),您的 Objective-C 代码就可以工作。它无法正确处理表情符号、标志和其他表示为 UTF-16 代理项对的字符,例如与

NSString *anotherString = @"😀一二三四五六七八九";

关于swift - 如何计算出一个字符串中子字符串的范围,然后在另一个字符串中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68219138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com