[英]How to convert NSArray to [Int] with Swift
我的问题很简单,
let string = "1,2,3,4,5,6"
因为我想在字符串中找到最大值,并且我想以这种方式使用方法,所以我需要这样做:
let array = string.componentsSeparatedByString(",") as [AnyObject]
let numArray = array as! [Int]
let maxNum = numArray.reduce(Int.min, combine: {max($0,$1)})
但是,“ array as![Int] ”中会出现错误。
fatal error: array cannot be bridged from Objective-C
如果是
let numArray = array as! [String]
可以,但是我们不能使用reduce方法。
那么,如何将带有字符串的数组转换为[Int]?
你可以映射数组
let string = "1,2,3,4,5,6"
let numArray = string.componentsSeparatedByString(",").map {$0.toInt()!}
您可以使用reduce
和optionals,以防止使用强制展开,如果字符串实际上不包含数字,则可能导致应用程序崩溃。
这是代码:
let array = string.componentsSeparatedByString(",")
let initial: Int? = .None
let max = array.reduce(initial) {
let num = $1.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).toInt()
return num > $0 ? num : $0
}
第一行将字符串拆分为字符串数组-请注意,由于该方法已经返回字符串数组,因此无需强制转换。
通过传递一个可选的整数作为初始值(设置为.None
(这是nil
的同义词))来使用reduce
方法。
传递给reduce
的闭包使用toInt()
将当前值转换为整数,该整数返回一个可选值,以解决无法转换为有效整数的字符串的问题。
接下来,如果闭包大于上一次迭代计算的值(或大于初始值),则闭包将返回转换后的数字,否则它将返回上一次迭代的值。
请注意,比较整数和nil是完全合法的:任何整数值始终大于nil
(甚至是负值)。
此方法适用于“普通”数字列表:
let string = "1, 2, 3, 4, 5, 6, 7" // The result is 7
而且还包含具有数字和非数字的列表:
let string = "1, 2, three, 4, 5, 6, seven" // the result is 6
并包含不包含数字的列表:
let string = "one, two, three, three, four, five, six, seven" // the result is nil
let string = "1,2,3,4,5,6"
func toInt(str: String) -> Int {
return str.toInt()!
}
let numArray = map(string.componentsSeparatedByString(",") as [String], toInt)
然后, numArray
为[1, 2, 3, 4, 5, 6]
。
在Swift 2.0中 ,
let string = "1,2,3,4,5,6"
let numArray = string.componentsSeparatedByString(",").map{ Int($0)! }
在Swift 4.0中:
let string = "1,2,3,4,5,6"
let stringArray = string.split(separator: ",").map(String.init)
let intArray = stringArray.flatMap(Int.init)
intArray.max()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.