2014-10-16 153 views
9

在Objective-C我用:如何查找Swift字符串中子字符串的最后一次出现?

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

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

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

回答

14

Cocoa框架应该可以在Swift中访问,但是您需要导入它们。尝试导入Foundation以访问NSString API。从“使用Swift与Cocoa和Objective-C”的“Working with Cocoa Data Types–Strings”指南:

Swift会自动桥接String类型和NSString类。 [...]要启用字符串桥接,只需导入Foundation。

此外,NSBackwardsSearch是一个枚举值(标&导入为option),所以你必须使用Swift的枚举/ option语法访问它(作为NSStringCompareOptions选项类型的一部分)。前缀从C enumeration值中除去,所以从值名称中删除NS

两者都在一起,我们有:

import Foundation 
"abc def ghi abc def ghi".rangeOfString("c", options:NSStringCompareOptions.BackwardsSearch) 

请注意,您可能需要使用distance and advance功能正常使用范围从rangeOfString

12

雨燕3.0:

"abc def ghi abc def ghi".range(of: "c", options: String.CompareOptions.backwards, range: nil, locale: nil) 
5

如果您要更换的最后一个子字符串中的:

(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" 
相关问题