代码在Objective中工作,试图转换为Swift。我提供了工作目标-C代码和Swift代码,它们在第10行( for subValue in aPropertyValue ...快速枚举器)上产生了编译错误。快速错误“类型'ABMultiValue‘不符合协议'SequenceType'”。
一些ABPerson属性可能包含多个值(例如,多个电话号码),并且是ABMultiValue类的对象(尽管Xcode调试器将它们报告为ABMultiValueCoreDataWrapper类)。附加的Objective代码循环通过多个值。我试图在Swift中做同样的事情,但是无法通过编译错误。两者都是Xcode命令行项目。
目标-C代码:
#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
ABAddressBook *addressBook = [ABAddressBook sharedAddressBook];
NSArray *people = [addressBook people];
for (ABPerson *person in people) {
for (NSString *aProperty in [ABPerson properties]) {
id aPropertyValue = [person valueForProperty: aProperty];
if ([aPropertyValue isKindOfClass: [ABMultiValue class]]) {
for (id subValue in aPropertyValue) {
NSLog(@"%@",subValue);
}
}
}
}
}
return 0;
}快速代码:
import Foundation
import AddressBook
let addressBook = ABAddressBook.sharedAddressBook()
let people = addressBook.people()
for person in people {
for property in ABPerson.properties() {
if let aPropertyValue : AnyObject = person.valueForProperty(property as NSString) {
if aPropertyValue is ABMultiValue {
// for subValue in aPropertyValue {
for subValue in aPropertyValue as ABMultiValue {
println("\(subValue)")
}
}
}
}
}发布于 2015-01-25 05:04:43
显然,您可以使用该索引:
let addressBook = ABAddressBook.sharedAddressBook()
let people = addressBook.people()
for person in people {
for property in ABPerson.properties() {
if let multiValue = person.valueForProperty(property as NSString) as? ABMultiValue {
for i in 0 ..< multiValue.count() {
println(multiValue.valueAtIndex(i))
}
}
}
}或者,按照this answer中的建议,您可以定义一个符合SequenceType的扩展
extension ABMultiValue: SequenceType {
public func generate() -> NSFastGenerator {
return NSFastGenerator(self)
}
}然后你就可以:
let addressBook = ABAddressBook.sharedAddressBook()
let people = addressBook.people()
for person in people {
for property in ABPerson.properties() {
if let multiValue = person.valueForProperty(property as NSString) as? ABMultiValue {
for identifier in multiValue {
let value: AnyObject = multiValue.valueForIdentifier(identifier as String)
println("\(identifier) : \(value)")
}
}
}
}https://stackoverflow.com/questions/28132714
复制相似问题