我正在尝试从我的ios项目(swift 2.3)解析csv文件并找到this website。在教程代码中,它包含以下代码部分:
if let content = String(contentsOfURL: contentsOfURL,
encoding: encoding, error: error) {
...........
}
而且我不确定它的作用。它是否创建了一个String对象?
答案 0 :(得分:0)
是否会创建一个String对象?
是的,它会根据contentsOfURL
提供的网址内容并使用encoding
提供的字符编码创建一个字符串。它类似于以下Objective-C代码:
NSString *content = [NSString stringWithContentsOfURL:contentsOfURL
encoding:encoding
error:&error];
if let
部分是条件陈述的一种形式。 let
用于为不可变变量赋值。在示例中的条件中使用它只允许条件语句的主体在该赋值成功时执行。因此,如果在获取给定URL处的数据时发生某些错误,或者由于某种原因无法创建字符串,则条件将失败并且不会执行正文。整个片段可能在Objective-C中以这样的方式编写:
NSString *content = [NSString stringWithContentsOfURL:contentsOfURL
encoding:encoding
error:&error];
if (content != nil) {
// do something with content
}
答案 1 :(得分:0)
该代码创建一个字符串,但它通过获取URL的内容来完成。通常该URL指向Internet上的资源。在这种情况下,它是一种非常糟糕的获取字符串的方法,因为它是一个可以挂起或失败的同步网络调用。在主线程上进行同步网络调用是一个非常糟糕的主意。
您可以将该代码包装在后台队列的GCD调用中,但我建议使用skip_before_action :redirect_to_accept_terms, only: [:accept_new_terms]
并提交数据任务。您的搜索字词为NSURLSession
(或仅在Swift 3中为NSURLSession
)和函数URLSession
。 (可能更容易搜索它的Objective-C名称func dataTask(with url: URL)
,因为Google搜索不能很好地处理特殊字符。)
看一下我创建的名为Async_demo的GitHub项目。它有一个名为dataTaskWithURL
的单例类,它从指定的URL下载一组数据。我们编写的目的是将数据作为DownloadManager
对象返回,但将结果从Data
转换为Data
将是一件简单的事情。
代码的关键位是:
String