首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的ABMultiValue地址簿多值属性编译错误

Swift中的ABMultiValue地址簿多值属性编译错误
EN

Stack Overflow用户
提问于 2015-01-25 02:51:11
回答 1查看 1.3K关注 0票数 1

代码在Objective中工作,试图转换为Swift。我提供了工作目标-C代码和Swift代码,它们在第10行( for subValue in aPropertyValue ...快速枚举器)上产生了编译错误。快速错误“类型'ABMultiValue‘不符合协议'SequenceType'”。

一些ABPerson属性可能包含多个值(例如,多个电话号码),并且是ABMultiValue类的对象(尽管Xcode调试器将它们报告为ABMultiValueCoreDataWrapper类)。附加的Objective代码循环通过多个值。我试图在Swift中做同样的事情,但是无法通过编译错误。两者都是Xcode命令行项目。

目标-C代码:

代码语言:javascript
复制
#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;
}

快速代码:

代码语言:javascript
复制
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)") 
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-25 05:04:43

显然,您可以使用该索引:

代码语言:javascript
复制
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的扩展

代码语言:javascript
复制
extension ABMultiValue: SequenceType {
    public func generate() -> NSFastGenerator {
        return NSFastGenerator(self)
    }
}

然后你就可以:

代码语言:javascript
复制
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)")
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28132714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档