如何将NSMutableOrderedSet转换为通用数组?

时间:2014-11-22 11:21:35

标签: ios generics swift nsorderedset

我有for for循环,pNSManagedObjectfathersto-many关系,所以我需要将NSMutableOrderedSet强制转换为{{1}但它不起作用,为什么?

[Family]

enter image description here enter image description here

2 个答案:

答案 0 :(得分:24)

您可以通过array属性获取集合的数组表示 - 然后您可以将其向下转换为正确的类型并分配给变量:

let families = p.fathers.array as [Family]

但当然你也可以直接在循环中使用它:

for f in p.fathers.array as [Family] {
    ....
}

答案 1 :(得分:2)

在这种情况下,应使用Antonio的简单解决方案。我想再讨论一下这个问题。如果我们尝试在'NSMutableOrderedSet'循环中枚举'for'的实例,编译器会抱怨:

  

错误:输入' NSMutableOrderedSet'不符合协议   '序列类型'

当我们写

for element in sequence {
    // do something with element
}

编译器将其重写为以下内容:

var generator = sequence.generate()

while let element = generator.next() {
    // do something with element
}

'NS(Mutable)OrderedSet'没有'generate()'方法,即它不符合'SequenceType'协议。我们可以改变这一点。首先我们需要一台发电机:

public struct OrderedSetGenerator : GeneratorType {

    private let orderedSet: NSMutableOrderedSet

    public init(orderedSet: NSOrderedSet) {
        self.orderedSet = NSMutableOrderedSet(orderedSet: orderedSet)
    }

    mutating public func next() -> AnyObject? {
        if orderedSet.count > 0 {
            let first: AnyObject = orderedSet.objectAtIndex(0)
            orderedSet.removeObjectAtIndex(0)
            return first
        } else {
            return nil
        }
    }
}

现在我们可以使用该生成器使'NSOrderedSet'符合'SequenceType'

extension NSOrderedSet : SequenceType {
    public func generate() -> OrderedSetGenerator {
        return OrderedSetGenerator(orderedSet: self)
    }
}

'NS(Mutable)OrderedSet'现在可用于'for'循环:

let sequence = NSMutableOrderedSet(array: [2, 4, 6])

for element in sequence {
    println(element) // 2 4 6
}

我们可以进一步实施'CollectionType''MutableCollectionType'(后者仅适用于'NSMutableOrderedSet'),使'NS(Mutable)OrderedSet'的行为与Swift的标准库集合相同。

不确定上述代码是否遵循最佳做法,因为我仍然试图了解所有这些协议的详细信息。