Swift:NSArray要设置?

时间:2015-12-03 16:23:09

标签: swift set nsarray

我正在尝试将NSArray转换为Swift Set

没有太多运气。

这样做的正确方法是什么?

例如,如果我有NSArray个数字:

@[1,2,3,4,5,6,7,8]

如何从Set创建Swift NSArray

4 个答案:

答案 0 :(得分:13)

如果您确定 NSArray仅包含数字对象 然后你可以将它转换为Int(或Double或者NSNumber的Swift数组 let nsArray = NSArray(array: [1,2,3,4,5,6,7,8]) let set = Set(nsArray as! [Int]) ,视您的需要而定)并创建一个集合:

if let set = (nsArray as? [Int]).map(Set.init) {
    print(set)
} else {
    // not an array of numbers
}

如果无法保证,请使用可选的演员:

let set = Set(nsArray.flatMap { $0 as? Int })
// Swift 4.1 and later:
let set = Set(nsArray.compactMap { $0 as? Int })

另一种变体(由@ JAL的评论推动):

NSArray

这给出了一组可转换的Int个元素 到library(ggplot2) library(reshape2) library(gtable) library(gridExtra) # Gets default ggplot colors gg_color_hue <- function(n) { hues = seq(15, 375, length=n+1) hcl(h=hues, l=65, c=100)[1:n]} # Transform to long format CTscores.m = melt(CTscores, id.var="initials") # Create a vector of colors with keys for the initials colvals <- gg_color_hue(nrow(CTscores)) names(colvals) <- sort(CTscores$initials) # This color vector needs to be the same length as the melted dataset cols <- rep(colvals,ncol(CTscores)-1) # Create a basic plot that will have a legend with the desired attributes g1 <- ggplot(CTscores.m, aes(x=variable, y=value, fill=initials)) + geom_dotplot(color=NA)+theme_bw()+coord_flip()+scale_fill_manual(values=colvals) # Extract the legend fill.legend <- gtable_filter(ggplot_gtable(ggplot_build(g1)), "guide-box") legGrob <- grobTree(fill.legend) # Create the plot we want without the legend g2 <- ggplot(CTscores.m, aes(x=variable, y=value)) + geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03,fill=cols,color=NA) + theme_bw()+coord_flip() # Create the plot with the legend grid.arrange(g2, legGrob, ncol=2, widths=c(10, 1)) ,并默默地忽略所有其他元素。

答案 1 :(得分:1)

如果您知道自己正在使用Int,那么您可以随时遍历数组并手动将每个元素添加到Set<Int>

let theArray = NSArray(array: [1,2,3,4,5,6,7,8])

var theSet = Set<Int>()

for number in (theArray as? [Int])! {
    theSet.insert(number)
}

print(theSet) // "[2, 4, 5, 6, 7, 3, 1, 8]\n"

我试图使用map制定更优雅的解决方案,我会在取得更多进展时更新此答案。

感谢MartinR suggestion使用unionInPlaceSequenceTypemap返回}而不是insert { {1}},这可以这样完成:

Set

请注意,由于明确转换为let theArray = NSArray(array: [1,2,3,4,5,6,7,8]) var mySet = Set<Int>() mySet.unionInPlace(theArray.map { $0 as! Int }) ,这可能不是最安全的解决方案。

答案 2 :(得分:1)

import Foundation

let nsarr: NSArray = NSArray(array: [1,2,3,4,5])
var set: Set<Int>
guard let arr = nsarr as? Array<Int>  else {
    exit(-1)
}
set = Set(arr)
print(set.dynamicType)
dump(set)
/*
Set<Int>
▿ 5 members
  - [0]: 5
  - [1]: 2
  - [2]: 3
  - [3]: 1
  - [4]: 4
*/

在免费桥接的帮助下,应该很容易......

答案 3 :(得分:0)

var array = [1,2,3,4,5]
var set = Set(array)