我正在寻找一种更短/更好的方法来获取我的Core Data应用程序中的第一个对象和NSSet

时间:2017-04-20 05:54:39

标签: ios swift core-data nsmanagedobject nsset

目前我有这段代码:

const bigBird = {height: 'tall', color: 'yellow', disposition: 'sunny'};
const {height, ...others} = bigBird;
//height == 'tall'
//others == {color: 'yellow', disposition: 'sunny'};

这是编码的正确方法吗?我知道if let myPhoneNumbers = person.phoneNumbers?.allObjects as? [PhoneNumber] { for myPhoneNumber in myPhoneNumbers { mainPhoneNumber = myPhoneNumber.number break } } 是无序的,可能是因为它没有自己的NSSet实现,例如:

.first

但我在思考我的代码不是最优雅的代码,也许不是正确的Swift代码。

2 个答案:

答案 0 :(得分:2)

我不知道为什么你会想要获得一组中的任意“第一”元素,但是你走了:

let first = (person.phoneNumbers?.allObjects as? [PhoneNumber])?.first

这会产生更多/更少的随机结果。以下是我的建议:

  • 将电话号码存储在一个阵列中,以便保留用户对电话号码的订购。
  • 我认为用户确定主号码的构成要好得多。也许存储对PhoneNumber内的“主”Person对象的引用。

答案 1 :(得分:2)

在您的代码中,myPhoneNumbers是一个数组,因此您可以使用myPhoneNumbers.first而不是循环。

if let myPhoneNumbers = person.phoneNumbers?.allObjects as? [PhoneNumber] {
    mainPhoneNumber = myPhoneNumbers.first
}

但是,正如已经指出的那样,你应该在你的集合上强加某种顺序,这样对于任何给定的集合执行这段代码的结果都是一样的。任意结果通常都很糟糕。

由于您提到您正在使用Core Data,我建议您在Person实体上添加一个便利属性,以将电话号码作为已排序的数组返回。

如果您的实体看起来像这样......

class PhoneNumber: NSManagedObject {
    @NSManaged var number: String
}

class PersonEntity: NSManagedObject {
    @NSManaged var phoneNumbers: NSSet?
}

...你可以创建一个像这样的便利属性:

class PersonEntity: NSManagedObject {

    @NSManaged var phoneNumbers: NSSet?

    // Arrays are often easier to work with than sets, 
    //  so provide a convenience property that returns
    //  phone numbers sorted
    var phoneNumbersArray: [PhoneNumber] {
        get {
            if let phoneNumbers = phoneNumbers {
                return (phoneNumbers.allObjects as! [PhoneNumber]).sorted() {
                    // here, sorting by phone number, but
                    // you can sort on whatever you want
                    $1.number > $0.number
                }
            }
            // return empty array if set is nil
            return [PhoneNumber]()
        }
    }
}

最后,使用一行代码获取第一个数字:

mainPhoneNumber = person.phoneNumbersArray.first

我喜欢将这种类型的便利数组属性添加到我的所有具有集合的实体中。在我看来,数组更易于使用。这里我选择返回一个空数组而不是一个nil数组,当set为nil时。如果您可以将nil和空手机设置相同,则可以正常工作。

另请注意,如果.first为空,phoneNumbersArray将返回nil。