Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我正在寻找一种更短/更好的方法,从我的核心数据应用程序中获取第一个对象,并在其中设置NSSet_Ios_Swift_Core Data_Nsmanagedobject_Nsset - Fatal编程技术网

Ios 我正在寻找一种更短/更好的方法,从我的核心数据应用程序中获取第一个对象,并在其中设置NSSet

Ios 我正在寻找一种更短/更好的方法,从我的核心数据应用程序中获取第一个对象,并在其中设置NSSet,ios,swift,core-data,nsmanagedobject,nsset,Ios,Swift,Core Data,Nsmanagedobject,Nsset,目前我有以下代码: if let myPhoneNumbers = person.phoneNumbers?.allObjects as? [PhoneNumber] { for myPhoneNumber in myPhoneNumbers { mainPhoneNumber = myPhoneNumber.number break } } 这是正确的编码方式吗。我知道NSSet是无序的,这可能是它没有自己的实现的原因。首先,例如: 但

目前我有以下代码:

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


但我认为我的代码不是最优雅的代码,也可能不是合适的Swift代码。

我不知道为什么你会想要得到集合的任意第一个元素,但现在你可以:

let first = (person.phoneNumbers?.allObjects as? [PhoneNumber])?.first
这将给出更多/更少的随机结果。以下是我的建议:

将电话号码存储在阵列中,以便保留用户对电话号码的排序。 我认为由用户来决定主数字的组成要好得多。可能在Person中存储对主PhoneNumber对象的引用。
在您的代码中,MyPhoneNumber是一个数组,因此可以使用MyPhoneNumber.first而不是循环

if let myPhoneNumbers = person.phoneNumbers?.allObjects as? [PhoneNumber] {
    mainPhoneNumber = myPhoneNumbers.first
}
但是,正如已经指出的,您应该对集合施加某种顺序,以便对任何给定集合执行此代码的结果都是相同的。武断的结果通常是糟糕的

由于您提到您正在使用核心数据,我建议在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
最后,用一行代码获得第一个数字,如下所示:

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时,我选择返回一个空数组而不是nil数组。如果你同意把零和空的手机都一视同仁,这就行了


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

对NSSet进行排序并获取第一个对象myPhoneNumbers是一个数组,因此可以执行myPhoneNumbers.first而不是使用for循环。为什么要使用集合的第一个对象?你自己说的,NSSet是无序的,你每次都会得到任意的电话号码,没有一致性为什么每次循环时你都要将mainPhoneNumber设置为另一个号码?你是对的,获取NSSet中的第一个对象或任何对象几乎是同一件事,因为顺序没有保证,所以不妨调用set.anyObject。有趣的是,我不知道任何对象。对于这样的事情,可能会有什么使用案例?我希望出现第一个号码的原因是,我希望能够为每个人分配一个以上的电话号码,在这个视图控制器中,我不需要特定的号码,只需要显示一个号码,如果用户单击手机,他将获得更多的详细信息。我希望用户输入的第一个数字能够方便地首先显示。进一步考虑一下,我可能会用其他东西来代替它。我想对输入的电话号码下一些订单,以防万一,例如,一个人有多个电话号码的类型=手机谢谢@PatrickMiron但正如你自己所说的,布景是不需要订购的。用户在电话号码中输入的顺序在确定它们在集合中出现的顺序方面绝对没有影响。我正在尝试查看是否可以返回第一个对象。在这种情况下没有意义,你的权利。但这引发了我的另一个问题,它是否会首先返回插入NSSet中的第一个对象,或者这也意味着它可能会返回,也可能不会返回。。。但是如果我理解Mike Tavern上面的评论,Core Data会返回一个NSArray,我相信它是NSSet的一个子类,或者获取的对象实际上是NSSet。。。我要去咕咕!真棒的评论。我可能不会在此实体中使用您的解释或代码,但我确实有另一个实体将获得此升级。呜呼!!谢谢,请注意,如果您正在处理许多记录,而您正在获取关系中的所有对象,而您只需要一个对象,那么这是非常不够的。首先,最好将电话号码存储为一个数组。这一切都太过复杂了,这是不必要的。@Alexander在核心数据中,一对多关系是用NSSet表示的。@MikeTaverne哦,对了,公平点。在这种情况下,我仍然遵从我的回答中的建议:我认为由用户决定主数字的组成更好。可能在Person中存储对主PhoneNumber对象的引用。