Ios Swift 4:无法识别的选择器发送到实例错误

Ios Swift 4:无法识别的选择器发送到实例错误,ios,swift,Ios,Swift,我正在使用swift 4中的UILocalizedIndexedCollation,不断出现以下错误: 异常:-[\u SwiftValue localizedTitle]:发送到实例0x60000024cc00的选择器无法识别 2018-01-06 21:11:14.148103-0500 TableViewContacts[27012:2886540][Contacts]与XPC服务通信时出错:错误域=nscoaerrorDomain代码=4101连接到名为com.apple.contact

我正在使用swift 4中的UILocalizedIndexedCollation,不断出现以下错误:

异常:-[\u SwiftValue localizedTitle]:发送到实例0x60000024cc00的选择器无法识别 2018-01-06 21:11:14.148103-0500 TableViewContacts[27012:2886540][Contacts]与XPC服务通信时出错:错误域=nscoaerrorDomain代码=4101连接到名为com.apple.contactsd的服务用户信息={NSDebugDescription=连接到名为com.apple.contactsd的服务}

我只是尝试使用contacts框架获取我的联系人,并将其显示在tableview上

这是我的排序规则的以下代码:

let collation = UILocalizedIndexedCollation.current()
    var sections: [[AnyObject]] = []
    var objects: [Contact] = [] {
        didSet {
            let selector: Selector = #selector(getter: UIApplicationShortcutItem.localizedTitle)
            sections = Array(repeating: [], count: collation.sectionTitles.count)

            let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
            for object in sortedObjects {
                let sectionNumber = collation.section(for: object, collationStringSelector: selector)
                sections[sectionNumber].append(object as AnyObject)
            }

            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }
以及获取我的联系人:

private func fetchContacts(){

    let store = CNContactStore()

    store.requestAccess(for: (.contacts)) { (granted, err) in
        if let err = err{
            print("Failed to request access",err)
            return
        }

        if granted {
            print("Access granted")
            let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
            let fetchRequest = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])

            fetchRequest.sortOrder = CNContactSortOrder.userDefault

            do {
                try store.enumerateContacts(with: fetchRequest, usingBlock: { ( contact, error) -> Void in
                    self.objects.append(Contact(contact: contact))
                })



                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }
            catch let error as NSError {
                print(error.localizedDescription)
            }


        }else{
            print("Access denied")
        }
    }

    }

我认为问题在于选择器。对于swift 4,我们在声明函数并将其用作选择器时使用@objc。但是在这种情况下,我不知道把它放在哪里。

是的,你的选择器错了。下面是我最后为让选择器工作所做的

var objects: [CollationIndexable] = [] {
        didSet {
            sections = Array(repeating: [], count: collation.sectionTitles.count)
            let selector = #selector(getter: CollationIndexable.collationString)

            let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
            for object in sortedObjects {
                let sectionNumber = collation.section(for: object, collationStringSelector: selector)
                sections[sectionNumber].append(object as AnyObject)
            }

            self.tableView.reloadData()
        }
    }
这是我的协议,您的对象应该实现

@objc protocol CollationIndexable {
    @objc var collationString : String { get }
}
下面是一个实现协议和选择器属性的具体CollationIndexable类型的示例

extension Contact : CollationIndexable {

    @objc var collationString : String {
        return lastName
    }
}

到底是哪一行导致了错误?添加异常断点并重新运行。你解决过这个问题吗,我面临着同样的错误