arrays - 如何将objective-c`sortedArrayUsingSelector:NSSelectorFromString`转换为swift?
问题描述
我试图转换objective-c code to
swiftobjective and got stuck on this line of
-c`代码:
NSArray *array = [[[InternalContactsHandler sharedBuffer] contacts] sortedArrayUsingSelector:NSSelectorFromString(@"string:")];
我尝试使用以下方法做类似的事情swift
:
var array = InternalContactsHandler.sharedBuffer()?.contacts()?.sorted(by: NSSelectorFromString("string"))
但我收到以下错误:
Cannot convert value of type 'Selector' to expected argument type '(Any, Any) throws -> Bool'
不知道它想让我扔什么或如何在代码中正确编写它。有任何想法吗?
编辑
尝试使用#selector
代码产生相同的结果:
var tempData = InternalContactsHandler.sharedBuffer()?.contacts()?.sorted( by: #selector(Contact.nameOfContactCompare:))
无法将“选择器”类型的值转换为预期的参数类型“(任何,任何)抛出 - > Bool”
Contacts.nameOfContactCompare
在objective-C
里面,看起来像这样:
-(NSComparisonResult)nameOfContactCompare:(Contact*)c{
NSString *f1 = [firstName stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
NSString *l1 = [lastName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *f2 = [c.firstName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *l2 = [c.lastName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (ABPersonGetSortOrdering() == kABPersonSortByFirstName) {
return [self sortPrio1contact1:f1 prio2c1:l1 prio3c1:company prio1c2:f2 prio2c2:l2 prio3c2:c.company];
} else {
return [self sortPrio1contact1:l1 prio2c1:f1 prio3c1:company prio1c2:l2 prio2c2:f2 prio3c2:c.company];
}
}
我已经在.h
文件中添加了这样的函数,以便它可以用于swift
:
-(NSComparisonResult)nameOfContactCompare:(Contact*)c;
旧objective-c
代码有效:
NSArray *array = [[[InternalContactsHandler sharedBuffer] contacts] sortedArrayUsingSelector:NSSelectorFromString(@"nameOfContactCompare")];
为什么不快速?
解决方案
您可以像这样按属性对数组进行排序:
yourArray = yourArray.sort({ $0.yourString.lowercased() < $1.yourString.lowercased() })
.lowercased() 是为了确保不考虑区分大小写。
推荐阅读
- javascript - 可以接收但无法将数据发送到firebase,代码问题?
- r - ggplot 计算中的 ROC 曲线 [r]
- spring-boot - 当通过 Dockerfile 上的 gradle 图像触发时,Jooq 无法找到数据库
- java - Apache Http Async Client 4.1.4:请求无法执行;I/O 反应器状态:已停止
- c - 如果传递了一个 shell 脚本,exec() 会为每个命令调用 fork 吗?
- javascript - HTML / VUE - 允许用户选择/激活多个元素并同时输入
- opencv - 对于 Redhat 上的 C++/C Open CV 安装
- javascript - 如何组合这些 HTML 文件以便在单个网页上同时运行它们?
- r - 如何找到R中的相似性?
- javascript - 如果脚本正在运行,HTA window_onUnload() 不会执行