创建新的CharacterSet时EXC BAD ACCESS

时间:2016-11-20 09:29:34

标签: swift exc-bad-access nscharacterset

我试图编写一个段塞函数,其中包括删除除连字符以外的任何标点字符。我认为最好的方法是创建一个新的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崩溃。

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

1 个答案:

答案 0 :(得分:0)

对我来说这看起来像个错误。构建任何两者的区别 CharacterSet导致“无限”递归和堆栈溢出。 以下是导致崩溃的最小示例:

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
    }
}