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

Ios 我可以在Swift闭包中使用多个分隔符拆分数字字符串吗?,ios,arrays,swift,closures,Ios,Arrays,Swift,Closures,我有一个带小数和十进制数的字符串数组 let stringArray = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"] 每个数组元素都映射到从字符串中提取数字的闭包中 let values = stringArray.map { s -> Double in 要么是分数(参见) 或十进制 问题:在Swift中,是否有一种方法可以使用多个分隔符拆分字符串,以便单个闭包可以返

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

    let stringArray = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"]
每个数组元素都映射到从字符串中提取数字的闭包中

    let values = stringArray.map { s -> Double in
要么是分数(参见)

或十进制

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

(继续关闭)


如果您打算从中创建浮点数 无论是十进制表示法还是小数,都没有 需要在小数点处拆分字符串

您可以尝试使用
双精度(字符串)
转换字符串, 如果失败了,在斜线处拆分它并转换分子 和分母分别为:

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
}
(对于无效输入,不返回
nil
,您还可以 考虑到<代码>抛出< /代码>一个错误,以中止执行
fatalError()
,或返回一些默认值。)

然后可以将此“实用功能”应用于每个阵列元素:

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

如果您打算从中创建浮点数 无论是十进制表示法还是小数,都没有 需要在小数点处拆分字符串

您可以尝试使用
双精度(字符串)
转换字符串, 如果失败了,在斜线处拆分它并转换分子 和分母分别为:

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
}
(对于无效输入,不返回
nil
,您还可以 考虑到<代码>抛出< /代码>一个错误,以中止执行
fatalError()
,或返回一些默认值。)

然后可以将此“实用功能”应用于每个阵列元素:

let strings = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"]
let values = strings.flatMap(doubleFromDecimalOrFraction)
由多个分隔符分割 使用
split
斯威夫特4

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersIn: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特3

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersInString: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特2

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)}) }
let str = "[0, 1, 2, 1]"
let separatorSet = NSCharacterSet(charactersInString: ",[]")
let comps = str.componentsSeparatedByCharactersInSet(separatorSet)

使用字符集 斯威夫特4

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersIn: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特3

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersInString: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特2

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)}) }
let str = "[0, 1, 2, 1]"
let separatorSet = NSCharacterSet(charactersInString: ",[]")
let comps = str.componentsSeparatedByCharactersInSet(separatorSet)

无论我们使用什么方法,结果都会收到数组。如果没有该信息,则使用了哪个分隔符

如果您只需要将字符串转换为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
}
由多个分隔符分割 使用
split
斯威夫特4

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersIn: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特3

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersInString: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特2

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)}) }
let str = "[0, 1, 2, 1]"
let separatorSet = NSCharacterSet(charactersInString: ",[]")
let comps = str.componentsSeparatedByCharactersInSet(separatorSet)

使用字符集 斯威夫特4

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersIn: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特3

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split { [",", "[", "]"].contains($0.description) }
let str = "[0, 1, 2, 1]"
let separatorSet = CharacterSet(charactersInString: ",[]")
let comps = str.components(separatedBy: separatorSet)
斯威夫特2

let s = "[0, 1, 2, 1]"
let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)}) }
let str = "[0, 1, 2, 1]"
let separatorSet = NSCharacterSet(charactersInString: ",[]")
let comps = str.componentsSeparatedByCharactersInSet(separatorSet)

无论我们使用什么方法,结果都会收到数组。如果没有该信息,则使用了哪个分隔符

如果您只需要将字符串转换为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
}
定义扩展(Swift 4):

用法:

let str = "aaa-bbb_ccc/ddd"
let arr = str.split(separators: "-_/")
结果:

[“aaa”、“bbb”、“ccc”、“ddd”]
定义扩展名(Swift 4):

用法:

let str = "aaa-bbb_ccc/ddd"
let arr = str.split(separators: "-_/")
结果:


[“aaa”、“bbb”、“ccc”、“ddd”]

为什么要在小数点处拆分像
“193.16”
这样的字符串?您可以直接将其转换为
双精度
。为什么字符串数组的变量名为
string
?“这真让人困惑。”马丁·R,对了,拆分只对分数有必要。如果闭包可以识别小数或十进制数,请对小数进行除法,并将
“193.16”
直接转换为
双精度,
我会非常满意。@rmaddy,要点。我重新命名了它。希望stringArray更清晰为什么要在小数点处拆分像
“193.16”
这样的字符串?您可以直接将其转换为
双精度
。为什么字符串数组的变量名为
string
?“这真让人困惑。”马丁·R,对了,拆分只对分数有必要。如果闭包可以识别小数或十进制数,请对小数进行除法,并将
“193.16”
直接转换为
双精度,
我会非常满意。@rmaddy,要点。我重新命名了它。希望stringArray是清晰的,你是说
返回除数/除数
?对。我的错误。谢谢@vacawama@Adrian,
返回红利/除数
工作正常(我还在检查其余部分)你是说
返回红利/除数
?对。我的错误。谢谢@vacawama@Adrian,
返回红利/除数
工作正常(我仍在检查其余部分)。这完全解开了问题,简化了问题。这必须是公认的答案。这完全解开了问题,简化了问题。这必须是公认的答案。