Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将objective-c代码转换为swift 4_Ios_Objective C_Swift - Fatal编程技术网

Ios 将objective-c代码转换为swift 4

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写了1.5年了,这是一种很好的语言。。所以我今天看到一篇关于swift的媒体文章,非常关注它,现在我正在尝试将我所有的
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]
强制
尝试与强制展开
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 }) { ...