Ios 将objective-c代码转换为swift 4
我已经用obj-c写了1.5年了,这是一种很好的语言。。所以我今天看到一篇关于swift的媒体文章,非常关注它,现在我正在尝试将我所有的Ios 将objective-c代码转换为swift 4,ios,objective-c,swift,Ios,Objective C,Swift,我已经用obj-c写了1.5年了,这是一种很好的语言。。所以我今天看到一篇关于swift的媒体文章,非常关注它,现在我正在尝试将我所有的obj-c代码转换为swift,幸运的是,除了这一部分,一切都完成了 NSString *path = [[NSBundle mainBundle] pathForResource:@"list" ofType:@"plist"]; NSArray *plistData = [NSArray arrayWithContentsOfFile:path];
obj-c
代码转换为swift
,幸运的是,除了这一部分,一切都完成了
NSString *path = [[NSBundle mainBundle] pathForResource:@"list" ofType:@"plist"];
NSArray *plistData = [NSArray arrayWithContentsOfFile:path];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"english ==[c] %@", self.userQuery.text]; // something like "Abbey"
NSArray *filtered = [plistData filteredArrayUsingPredicate:filter];
NSLog(@"found matches: %@ : %@", filtered,[filtered valueForKey:@"kurdi"]);
if (filtered.count>0) {
NSDictionary *dic = filtered[0];
self.theMeaningLabel.text = dic[@"kurdi"];
} else {
self.theMeaningLabel.text = @"Yay!";
}
我无法将其正确转换为新的swift 4
,它会产生随机错误
编辑
在几次搜索之后,我可以只写两行代码
这是我的swift密码
var path: String? = Bundle.main.path(forResource: "list", ofType: "plist")
var plistData = [Any](contentsOfFile: path!)
var filter = NSPredicate(format: "english ==[c] %@", searchText)
// something like "Abbey"
var filtered = plistData?.filter { filter.evaluate(with: $0) }
print("found matches: \(filtered) : \(filtered?.value(forKey: "kurdi"))")
if filtered?.count > 0 {
var dic = filtered[0]
// theMeaningLabel.text = dic["kurdi"]
}
else {
//theMeaningLabel.text = "Yay!"
}
但是得到
参数标签“(contentsOfFile:)”与任何可用重载都不匹配
最终编辑
上面的代码很好,但是出现了一个错误
if filtered?.count > 0 { // here
var dic = filtered![0]
// theMeaningLabel.text = dic["kurdi"]
}
else {
// theMeaningLabel.text = "Yay!"
}
得到
二进制运算符“>”不能应用于“Int”和“Int”类型的操作数
不建议将Objective-C直译为Swift,因为在许多情况下,它没有利用Swift的改进语义 由于Apple从
String
中删除了所有路径操作API,并向其他类添加了更多URL
相关API,因此如果可能,请始终使用URL
let url = Bundle.main.url(forResource: "list", withExtension: "plist")!
强制取消包装的url是安全的,因为文件必须位于捆绑包中。崩溃将揭示设计错误,并且不得在运行时发生
<不同于基础集合类型,Swift集合类型不支持隐式属性列表转换,所以快捷方式是使用<代码>数据< /代码>和<代码>属性列表序列化< /代码>
let data = try! Data(contentsOf: url)
let dataArray = try! PropertyListSerialization.propertyList(from: data, format: nil) as! [Any]
强制尝试出于同样的原因,code>与强制展开url
一样安全
[Any]
是最未指明的Swift数组。如果数组应该是字典数组,则编写[[String:Any]]
甚至[[String:String]]]
如果所有值都是String
。如果它应该是一个字符串数组,请编写[String]
。Swift鼓励开发人员尽可能针对特定类型
可以用Swift中的filter
功能替换NSPredicate
。例如,字符串数组可以不区分大小写地使用
let filtered = dataArray.filter { $0.compare(searchText, options:.caseInsensitive) == .orderedSame }
如果数组包含字典,则需要指定键(与NSPredicate相同)
最后是ObjC表达式
if (filtered.count > 0) { ...
可以用Swift写得更具描述性
if filtered.isEmpty == false { ...
或
如果你只想找一个项目,你甚至可以写
if let foundObject = dataArray.first(where: { $0.compare(searchText, options:.caseInsensitive) == .orderedSame }) { ...
不要显示Objul-C,显示你得到的SWIFT和错误。@ PulW11,实际上不能让我的头在它周围,停留在谓词格式中,等待某人给出一个正确的干净代码。谓词格式完全相同,因为这是基础库的一部分,而不是Swift或Objul-C.VISHalPATELL的可能副本。不要在没有真正阅读双方的情况下标记问题,你给出了错误的代码,我很感激,但这不是重复的,我自己解决了!上一次我在obj-c上遇到问题时,你帮了我的忙,再次强调,sof需要更多像你这样的人
if filtered.isEmpty == false { ...
if !filtered.isEmpty { ...
if let foundObject = dataArray.first(where: { $0.compare(searchText, options:.caseInsensitive) == .orderedSame }) { ...