在Objective-C中我使用了:
[@"abc def ghi abc def ghi" rangeOfString:@"c" options:NSBackwardsSearch];
但是现在貌似没有NSBackwardsSearch。有人可以提供Swift的等效代码吗?
如果可能,我想能够查找整个字符串中的字符编号。所以在上面的示例中,它将返回3。
如果你想替换字符串中的最后一个子字符串:
(Swift 3)
extension String
{
func replacingLastOccurrenceOfString(_ searchString: String,
with replacementString: String,
caseInsensitive: Bool = true) -> String
{
let options: String.CompareOptions
if caseInsensitive {
options = [.backwards, .caseInsensitive]
} else {
options = [.backwards]
}
if let range = self.range(of: searchString,
options: options,
range: nil,
locale: nil) {
return self.replacingCharacters(in: range, with: replacementString)
}
return self
}
}
用法:
let alphabet = "abc def ghi abc def ghi"
let result = alphabet.replacingLastOccurrenceOfString("ghi",
with: "foo")
print(result)
// "abc def ghi abc def foo"
或者,如果你想完全删除最后一个子字符串并将其清理干净:
let result = alphabet.replacingLastOccurrenceOfString("ghi",
with: "").trimmingCharacters(in: .whitespaces)
print(result)
// "abc def ghi abc def"
Cocoa框架应该可以在Swift中访问,但是你需要导入它们。尝试导入Foundation
以访问NSString API。来自“使用Swift与Cocoa和Objective-C”指南的“使用Cocoa数据类型-字符串”:
此外,Swift会自动在String类型和NSString类之间进行桥接。[...] 要启用字符串桥接,只需导入Foundation。
NSBackwardsSearch
是一个枚举值(标记并作为option导入),因此您必须使用Swift的enum / option语法来访问它(作为NSStringCompareOptions
选项类型的一部分)。前缀从C enumeration值中剥离,因此从值名称中删除NS
。import Foundation
"abc def ghi abc def ghi".rangeOfString("c", options:NSStringCompareOptions.BackwardsSearch)
distance
和advance
函数来正确利用rangeOfString
的范围。Swift 3.0:
"abc def ghi abc def ghi".range(of: "c", options: String.CompareOptions.backwards, range: nil, locale: nil)
Swift 5:
"abc def ghi abc def ghi".range(of: "c", options: NSString.CompareOptions.backwards)