【问题标题】:Swift Strings and NSString initializersSwift 字符串和 NSString 初始化器
【发布时间】:2014-10-15 19:10:15
【问题描述】:

“……你几乎不需要直接使用 NSString 类 你自己的代码”

摘自:Apple Inc.“将 Swift 与 Cocoa 和 Objective-C 结合使用”。 电子书。 https://itun.es/us/1u3-0.l

尽管有这个大胆的声明,但我想我已经找到了需要 NSString 的情况。例如,考虑这个代码块:

NSString(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow"),
    encoding: NSUTF8StringEncoding,
    error: &error)

我不能用 Swift 字符串做到这一点,对吧?无论哪种方式,这都行不通:

String(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow"),
    encoding: NSUTF8StringEncoding,
    error: &error) //Compiler error

所以我应该在这里使用 NSString 吗?或者在 Swift 中有另一种首选方法吗?

【问题讨论】:

  • 公平地说,你真的不应该使用NSString +contentsOfURL:...,因为它会发出同步网络请求。请改用NSURLSession dataTaskWithURL:completionHandler:

标签: string swift nsstring


【解决方案1】:

不同之处在于,String 的 NSURL 不能为 nil,但 NSURL(...) 的返回是可选的 - 您需要将其解包:

var error: NSError? = nil
String(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow")!,
    // NB ! after NSURL(...)
    encoding: NSUTF8StringEncoding,
    error: &error)

或者更明确(并且正确):

var error: NSError? = nil
if let url = NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow") {
    String(
        contentsOfURL: url,
        encoding: NSUTF8StringEncoding,
        error: &error)
}

【讨论】:

  • 我尝试将这两个粘贴到 Playground 中,但两次都出现编译器错误。
  • 这个答案对 Xcode 6.1 是正确的,但不是 Xcode 6.0
【解决方案2】:

Foundation 框架扩展了 Swift 原生的 String 类型,使其具有与 NSString 相同的初始化器,因此文档正确的。 (谢谢,newacct。)

var error: NSError?
let urlString: String? = String(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow")!,
    encoding: NSUTF8StringEncoding,
    error: &error)

请务必注意您的可选项 - NSURL 的初始化程序返回一个可选项,该可选项需要解包以在 NSString 初始化程序中使用,该初始化程序本身返回一个可选项。编译器可能一直在以一种典型的迟钝方式抱怨这一点。

【讨论】:

  • 如果 Foundation 被导入,String 确实有在 Xcode 6.1 中 contentsOf...format:arguments: 的初始化器。
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2011-07-24
  • 2011-03-20
相关资源
最近更新 更多