创建一个新的CharacterSet时出现EXC BAD ACCESS

问题描述:

我正在尝试编写一个slugging函数,它涉及除去连字符之外的任何标点符号。我认为这样做是创建一个新的CharacterSet如下的最佳方式:创建一个新的CharacterSet时出现EXC BAD ACCESS

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崩溃。

我注意到涉及这个错误的大多数问题都是由一些特定的语法错误或类似的引起的,但我无法找到它在这里。有任何想法吗?

这看起来像一个bug给我。建立差异任意两个 CharacterSet s导致“无限”递归和堆栈溢出。 下面是一个小例子,这将导致崩溃:

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

一种解决方法是使用CharacterSet

public mutating func remove(charactersIn string: String) 

方法代替:

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

,或者如果你想扩展方法:

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

这个错误是https://bugs.swift.org/browse/SR-2503,已经在Foundation中修复:https://github.com/apple/swift/pull/5201,Corelibs-foundation即将发布修复:https://github.com/apple/swift-corelibs-foundation/pull/680 – jtbandes