Swift 中关键字“throws”的含义是什么?

Moh*_*ein -1 syntax nsurl nsdata throws swift

这里的“throws”关键字是什么意思:

这段代码需要很长时间才能执行,我认为上图中的“throws”关键字相关:

let url = URL(string:"\(APIs.postsImages)\(postImg)")
let imgData = try? Data.init(contentsOf: url)
self.postImage.image = UIImage.init(data: imgData)
Run Code Online (Sandbox Code Playgroud)

ARG*_*Geo 5

init() throws可以返回有关失败的更多信息,并让调用者决定他们是否关心它。在此处阅读有关它的有用帖子。

要指示函数、方法或初始化程序可以抛出错误,您需要throws在函数声明中的参数后面写上关键字。标记throws为 的函数称为抛出函数。如果函数指定了返回类型,则在返回箭头之前写入 throws 关键字。

func thisFunctionCanThrowErrors() throws -> String
Run Code Online (Sandbox Code Playgroud)

或者在实际代码中它可能是这样的:

enum PossibleErrors: Error {
    case wrongUsername
    case wrongPassword
}

func loggingIn(name: String, pass: String) throws -> String {

    if name.isEmpty { 
        throw PossibleErrors.wrongUsername 
    }
    if pass.isEmpty { 
        throw PossibleErrors.wrongPassword 
    }
    return "Fine"
}
Run Code Online (Sandbox Code Playgroud)

throwing functions这样必须使用以下试运营的一个被称为:

  • 尝试
  • 尝试?
  • 尝试!

使用init() throws您可以中断类初始化程序的执行,而无需填充所有存储的属性:

class TestClass {

    let textFile: String

    init() throws {
        do {
            textFile = try String(contentsOfFile: "/Users/swift/text.txt", 
                                        encoding: NSUTF8StringEncoding)
        catch let error as NSError {
            throw error
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在一个结构中,你甚至可以避免do/catch块:

struct TestStruct {

    var textFile: String

    init() throws {
        textFile = try String(contentsOfFile: "/Users/swift/text.txt", 
                                    encoding: NSUTF8StringEncoding)
    }
}
Run Code Online (Sandbox Code Playgroud)