如何在Swift字符串中找到最后一个子字符串?

时间:2014-10-16 18:42:57

标签: string swift substring

在Objective-C中,我用过:

[@"abc def ghi abc def ghi" rangeOfString:@"c" options:NSBackwardsSearch];

但现在NSBackWardsSearch似乎不存在。任何人都可以提供Swift的等效代码吗?

如果可能,我希望能够在整个字符串中找到字符编号。所以在上面的例子中它将返回3.

4 个答案:

答案 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)