我可以在Swift中使用多个分隔符分割一个数字string吗?

我有一个分数和十进制数字的string数组。

let stringArray = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"] 

每个数组元素都映射到一个闭包,其中的数字是从string中提取的。

  let values = stringArray.map { s -> Double in 

任何分数(见前面的文章 )

  let splitStrings = s.characters.split(separator: "/").map(String.init).map({ Double($0) }) 

或十进制

  let splitStrings = s.characters.split(separator: ".").map(String.init).map({ Double($0) }) 

问题 :在Swift中有一种方法可以使用多个分隔符来分割string,所以一个闭包可以返回小数值或小数值吗?

(继续closures)

 switch (token)) { case "/" : print( "fraction") let pathA = splitString[0]!/splitString[1]! return pathA case "." : print( "decimal") let upperSplit = splitString[0]! let lowerSplit = splitString[1]! * 0.1 // restore decimal point let pathB = upperSplit+lowerSplit return pathB } } 

如果您的目的是从十进制表示或分数中创build浮点数,则不需要在小数点处拆分string。

您可以尝试使用Double(string)来转换string,如果失败,则将其拆分为斜杠并分别转换分子和分母:

 func doubleFromDecimalOrFraction(s: String) -> Double? { // Try to convert from decimal representation: if let value = Double(s) { return value } // Try to convert from fractional format: if let range = s.range(of: "/"), let num = Double(s.substring(to: range.lowerBound)), let den = Double(s.substring(from: range.upperBound)) { return num/den } // Invalid format return nil } 

(而不是为无效input返回nil ,你也可以考虑throw一个错误,用fatalError()中止执行,或返回一些默认值。

这个“效用函数”可以应用于每个数组元素:

 let strings = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"] let values = strings.flatMap(doubleFromDecimalOrFraction) 

由多个分隔符分割

使用字符

Swift 3

 let s = "[0, 1, 2, 1]" let splitted = s.characters.split { [",", "[", "]"].contains(String($0)) } 

Swift 2

 let s = "[0, 1, 2, 1]" let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)}) } 

使用characterSet

Swift 3

 let str = "[0, 1, 2, 1]" let separatorSet = CharacterSet(charactersInString: ",[]") let comps = str.components(separatedBy: separatorSet) 

Swift 2

 let str = "[0, 1, 2, 1]" let separatorSet = NSCharacterSet(charactersInString: ",[]") let comps = str.componentsSeparatedByCharactersInSet(separatorSet) 

不pipe用什么方法,结果你都会收到数组。 没有信息,使用哪个分隔符

如果你只需要将string转换为doble

 let array = stringArray .flatMap { element in if let value = Double(element) { return value } let parts = element.components(separatedBy: "/") guard parts.count == 2, let dividend = Double(parts[0]), let divisor = Double(parts[1]), divisor != 0 else { return nil } return dividend / divisor }