EXC BAD ACCESS 同时创建一个新的 CharacterSet

EXC BAD ACCESS while creating a new CharacterSet

我正在尝试编写一个 slugging 函数,该函数涉及删除连字符以外的所有标点符号。我认为最好的方法是创建一个新的 CharacterSet,如下所示:

import Foundation

extension CharacterSet {

    func subtracting(charactersIn string: String) -> CharacterSet {
        let unwantedCharacters = CharacterSet(charactersIn: string)
        return self.subtracting(unwantedCharacters)
    }


}

let punctuationCharactersExcludingHyphen = CharacterSet.punctuationCharacters.subtracting(charactersIn: "-")

<#slug function using punctuationCharactersExcludingHyphen#>

其中 slug function 是我已经用现有字符集测试过的函数。问题是赋值 let punctuationCharactersExcludingHyphen...EXC_BAD_ACCESS code=2.

而崩溃

我注意到涉及此错误的大多数问题都是由某些特定的语法错误或类似错误引起的,但我无法在此处找到它是什么。有什么想法吗?

我觉得这像是一个错误。构建any两个的差值 CharacterSets 导致 "infinite" 递归和堆栈溢出。 这是导致崩溃的最小示例:

let cs1 = CharacterSet.punctuationCharacters
let cs2 = CharacterSet.decimalDigits
let cs = cs1.subtracting(cs2)

解决方法是使用

public mutating func remove(charactersIn string: String)

CharacterSet 的方法改为:

var punctuationCharactersExcludingHyphen = CharacterSet.punctuationCharacters
punctuationCharactersExcludingHyphen.remove(charactersIn: "-")

或者如果你想要一个扩展方法:

extension CharacterSet {
    func subtracting(charactersIn string: String) -> CharacterSet {
        var cs = self
        cs.remove(charactersIn: string)
        return cs
    }
}