【问题标题】:Getting Error with NSStringEnumerationOptions.ByWords - Swift 4.2NSStringEnumerationOptions.ByWords 出错 - Swift 4.2
【发布时间】:2019-07-31 17:14:32
【问题描述】:

我正在尝试将此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&lt;String.Index&gt;(self.startIndex, in: self.endIndex)

然后,我得到这个错误,没有修复建议:

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

这些错误可能是由于 Swift 版本更新而导致的,我无法弄清楚编写此行的正确方法。

【问题讨论】:

    标签: swift nsstring nsrange


    【解决方案1】:

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

    新的声明:

    func enumerateSubstrings(in range: R, options opts: String.EnumerationOptions = default, _ body: @escaping (String?, Range, Range, inout Bool) -> Void) 其中 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 本身以支持 Substrings。您可以在我发布的答案here

    中查看如何实现它

    【讨论】:

    • 你知道有没有Swift内置函数来识别String是否包含英文单词?
    • 不,没有。但是你可以检查这个词是不是英文
    • 你能给我指出一个Swift 算法,它可以识别String 是否是英文单词吗?
    • extension String { var isEnglishWord: Bool { return UITextChecker().rangeOfMisspelledWord(in: self, range: NSRange(location: 0, length: utf16.count), startingAt: 0, wrap: false, language: "en_US").location == NSNotFound } }
    • 因为您显然知道您的代码。我必须再问一个问题......如果我有一个SetStrings 并且我想循环通过Set 以识别Strings 是英文单词怎么办?我尝试这样做的原因是 b/c 我正在尝试解决“电话单词”算法问题。该问题需要一种算法来识别给定电话号码可以映射到的所有可能的英语单词。我已经基本完成了。现在,我只需要能够遍历映射出的Strings 中的Set 并正确识别任何英文单词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2020-08-05
    • 2019-01-22
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多