我可以在Swift闭包中使用多个分隔符拆分数字字符串吗?

Gre*_*reg 1 arrays closures ios swift

我有一个带小数和十进制数的字符串数组.

    let stringArray = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"]
Run Code Online (Sandbox Code Playgroud)

每个数组元素都映射到一个闭包中,其中从字符串中提取数字.

    let values = stringArray.map { s -> Double in
Run Code Online (Sandbox Code Playgroud)

分数(见前文)

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

或小数

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

问题:在Swift中是否有一种方法可以使用多个分隔符拆分字符串,因此单个闭包可以返回小数值或小数值?

(继续关闭)

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
        }
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ski 7

由多个分隔符拆分

运用 split

斯威夫特4

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

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

使用characterSet

斯威夫特4

let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersIn: ",[]")
let comps = str.components(separatedBy: separatorSet)
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

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

斯威夫特2

let str = "[0, 1, 2, 1]"
let separatorSet = NSCharacterSet(charactersInString: ",[]")
let comps = str.componentsSeparatedByCharactersInSet(separatorSet)
Run Code Online (Sandbox Code Playgroud)

无论我们将使用什么方法,因此,您将收到数组.没有信息,使用了哪个分隔符

如果只需要将String转换为Double

let array = stringArray.compactMap { element -> Double? 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
}
Run Code Online (Sandbox Code Playgroud)