目前我有这段代码:
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代码。
答案 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。