将NSSet转换为Swift数组

cnwbcb6i  于 2022-12-17  发布在  Swift
关注(0)|答案(7)|浏览(128)

在CoreData中,我定义了一个 * 无序 * 对多关系,在Swift中定义如下:

@NSManaged var types : NSMutableSet

然而,为了最好地使用Swift,我想使用Type[]这样的普通Swift数组。然而,CoreData强制我使用NS(Mutable)Set。我如何将NSSet类型转换/转换为Array<Type>[]

juud5qan

juud5qan1#

var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray  //NSArray
okxuctiv

okxuctiv2#

  • 从Xcode 7.2开始,使用Swift 2.1.1*

实际上,我通过试验发现:

@NSManaged var types : Set<Type>

效果非常好。
事实是CoreData产生了一些类似的想法:

@NSManaged var types : NSSet

当从编辑器创建NSManagedObject子类时。所以我想知道是否有一个不太冗长的方法来使用filter方法而不进行强制转换。但是Swift应该在NSSet、NSArray和它们的对应物之间自动桥接。所以我尝试直接将其声明为Set,它工作正常。
回答这个问题,将其转换为Array就变得很简单了:

Array(types)
wribegjk

wribegjk3#

我是这样做的:

let array = object.NSSet?.allObjects as! [ArrayType]

然后,您可以正常操作阵列:

for item in array {
    id = item.id
}
wko9yo5t

wko9yo5t4#

使用map得到如下数组:

extension NSSet {
  func toArray<T>() -> [T] {
    let array = self.map({ $0 as! T})
    return array
  }
}

...
let myArray: [MyType] = set.toArray()
6tdlim6h

6tdlim6h5#

此答案在Xcode 7.2/Swift 2.1中已过时。请参阅已接受的答案以获取更新的答案。
我目前使用的是obj.types.allObjects as Type[],但这感觉像是一个黑客/变通方案。

qmelpv7a

qmelpv7a6#

也可以使用.sortedArray对元素进行排序。
雨燕3:

yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]

对于字符串,请NSString.compare在#selector调用中使用www.example.com。

4dbbbstv

4dbbbstv7#

感谢@大卫的解决方案,我也遇到了同样的情况在我目前的项目中,我们仍然使用Objective C和快速桥接的核心数据模块,所以在我的情况下,我不得不使用以下代码,因为编译器无法干预要转换的泛型类型是什么,我不得不使用实际传递它:(

extension Set {
    
    func toArray<S>(_ of: S.Type) -> [S] {
        let array = self.map({$0 as! S})
        return array
    }
    
}

并使用:

Items?.toArray(XYZ.self)

在我的托管对象中;变量如下所示,以供参考

@property (nullable, nonatomic, retain) NSSet<XYZ *> * items;

相关问题