我正在尝试将NSArray
转换为Swift Set
。
没有太多运气。
这样做的正确方法是什么?
例如,如果我有NSArray
个数字:
@[1,2,3,4,5,6,7,8]
如何从Set
创建Swift NSArray
?
答案 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使用unionInPlace
(SequenceType
从map
返回}而不是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)