在Objective-C中,我用过:
[@"abc def ghi abc def ghi" rangeOfString:@"c" options:NSBackwardsSearch];
但现在NSBackWardsSearch似乎不存在。任何人都可以提供Swift的等效代码吗?
如果可能,我希望能够在整个字符串中找到字符编号。所以在上面的例子中它将返回3.
答案 0 :(得分:17)
可以在Swift中访问Cocoa框架,但是您需要导入它们。尝试导入Foundation
以访问NSString API。来自" Working with Cocoa Data Types–Strings" "使用Swift与Cocoa和Objective-C"导:
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
and advance
函数来正确使用rangeOfString
中的范围。
答案 1 :(得分:12)
Swift 3.0:
"abc def ghi abc def ghi".range(of: "c", options: String.CompareOptions.backwards, range: nil, locale: nil)
答案 2 :(得分:12)
如果你想替换字符串中的最后一个子字符串:
(斯威夫特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"
答案 3 :(得分:-1)
快捷键5:
"abc def ghi abc def ghi".range(of: "c", options: NSString.CompareOptions.backwards)