swift - NSStringEnumerationOptions.ByWords 出现错误 - Swift 4.2

标签 swift nsstring nsrange

我正在尝试添加此Extension我的代码以便按单词枚举子字符串。该代码的来源日期为 2015 年,因此这显然是 Swift 的早期版本。 。我正在使用Swift4.2我不知道如何正确更新下面带有注释的行中的代码。

extension String {
    func words() -> [String] {

        let range = Range<String.Index>(start: self.startIndex, end: self.endIndex) // THIS LINE CAUSES ERROR
        var words = [String]()

        self.enumerateSubstringsInRange(range, options: NSStringEnumerationOptions.ByWords) { (substring, _, _, _) -> () in
            words.append(substring)
        }

        return words
    }
}

我最初收到此错误:调用中的参数标签不正确(有“start:end:”,预期为“_:in:”)

我按照“修复”提示操作,它将行更改为:

let range = Range<String.Index>(self.startIndex, in: self.endIndex)

然后,我收到此错误,但没有修复建议:

无法将“String.Index”类型的值转换为预期参数类型“NSRange”(又名“_NSRange”)

错误可能是由于 Swift版本更新,我不知道编写此行的正确方法。

最佳答案

自 Swift3 以来,范围方法中枚举子字符串的语法发生了一些变化:

新声明:

func enumerateSubstrings(in range: R, options opts: String.EnumerationOptions = default, _ body: @escaping (String?, Range, Range, inout Bool) -> Void) where R : RangeExpression, R.Bound == String.Index

extension String {
    func words() -> [String] {
        var words = [String]()
        enumerateSubstrings(in: startIndex..., options: .byWords) { substring, _, _, _ in
            words.append(substring!)
        }
        return words
    }
}
<小时/>
"abc def".words()  //  ["abc", "def"]

请注意,在 Swift 4 或更高版本中,您应该扩展 StringProtocol 而不是类型 String 本身,以支持 Substring。你可以在我发布的答案here中查看如何实现它

关于swift - NSStringEnumerationOptions.ByWords 出现错误 - Swift 4.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084091/

相关文章:

ios - 如何获取 NSString 中子字符串的 NSRange(s)?

objective-c - 如何在 NSString 中使用占位符

objective-c - 防止 subarrayWithRange 中的 NSRangeException

ios - 如何将字符串拆分为以 ios 中的某些字符开头的子字符串

swift - 向 Swift 包管理器提供配置文件

swift - SwiftUI 上带有 TextField 的可删除表

xcode - Swift UISplitViewController 具有用于详细 View 的多个 Storyboard

ios - 有没有办法访问 UIStackView 设置的约束的优先级?

objective-c - 使用连接的 NSString 执行选择器以查找 UIImageView

ios - 使用 NSRange 获取子字符串