-->

Cast NSString(contentsOfURL:…) to String?

2019-09-10 11:31发布

问题:

public convenience init(nsurl:NSURL) {
    var enc:NSStringEncoding = NSUTF8StringEncoding
    var err:NSError?
    let str:String? =
    NSString(
        contentsOfURL:nsurl, usedEncoding:&enc, error:&err
    )
    if err != nil { self.init(err!) }
    else { self.init(string:str!) }
}

Swift is version 1.2, error message is:

NSString? is not convertible to string

回答1:

With Swift 1.2 automatic bridging between String and NSString has been removed.

So you have to explicitly do the cast :

let str = NSString(contentsOfURL:nsurl, usedEncoding:&enc, error:&err) as? String



回答2:

Swift's String accepts this same initializer as NSString, so you don't even have to use NSString nor to typecast:

let str = String(contentsOfURL: nsurl, encoding: enc, error: &err)

Update for Swift 2.0

do {
    let str = try String(contentsOfURL: nsurl, encoding: enc)
    print(str)
} catch {
    print(error)
}

You can also use an Optional with try? if you want, in this case no need for do catch:

if let str = try? String(contentsOfURL: nsurl, encoding: enc) {
    print(str)
} else {
    // didn't succeed
}


回答3:

In Swift 3 I am using the following

do{
  let str = try String(contentsOf:personUrl!)
  print(str)
}catch let error{
  print(error)
}