基础Swift是iOS,macOS,watchOS和tvOS应用程序开发的新编程语言尽管如此,Swift的很多部分都将从您在C和Objective-C中开发的经验中熟悉起来,我来为大家科普一下关于swift中的声明?以下内容希望对你有帮助!

swift中的声明(Swift4.1官方文档大全)

swift中的声明

基础

Swift是iOS,macOS,watchOS和tvOS应用程序开发的新编程语言。尽管如此,Swift的很多部分都将从您在C和Objective-C中开发的经验中熟悉起来。

Swift提供了它自己的所有基本C和Objective-C类型的版本,包括用于整数的Int,用于浮点值的Double和Float,用于布尔值的Bool和用于文本数据的String。 Swift还提供了三种主要集合类型的强大版本,如集合类型中所述的Array,Set和Dictionary。

像C一样,Swift使用变量来存储和引用一个识别名称的值。 Swift也广泛使用其值不能改变的变量。这些被称为常量,并且比C中的常量强大得多。当您使用不需要更改的值时,常量在Swift中用于使代码更安全和更清晰。

除了熟悉的类型之外,Swift还引入了在Objective-C中找不到的高级类型,例如元组。元组使您能够创建和传递值组。您可以使用元组作为单个复合值从函数中返回多个值。

Swift还引入了可选类型,它处理缺少值的情况。可选项:“有价值,它等于x”或“根本没有价值”。使用optionals类似于在Objective-C中使用零指针,但它们适用于任何类型,而不仅仅是类。 Objective-C中的option指针不仅比零指针更安全,更具表现力,它们是Swift最强大功能中的核心。

  • if let constantName = someOptional {

  • statements

  • }

  • 您可以重写Optionalals部分中的possibleNumber示例以使用可选绑定而不是强制展开:

    if let actualNumber = Int(possibleNumber) {

    print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")

    } else {

    print("\"\(possibleNumber)\" could not be converted to an integer")

    }

    // Prints ""123" has an integer value of 123"

    他的代码可以被理解为:

    “如果由Int(possibleNumber)返回的可选Int包含一个值,则将一个名为actualNumber的新常量设置为包含在可选项中的值。”

    如果转换成功,那么actualNumber常量可用于if语句的第一个分支内。它已经被初始化为包含在可选项中的值,所以不需要使用!后缀以访问其值。在本例中,actualNumber仅用于打印转换结果。

    您可以使用可选绑定的常量和变量。如果要在if语句的第一个分支内操作actualNumber的值,则可以编写if var actualNumber,而将可选内容包含在变量中而不是常量中。

    您可以根据需要在单个if语句中包含尽可能多的可选绑定和布尔条件,并用逗号分隔。如果可选绑定中的任何值为零,或者任何布尔条件的计算结果为false,则整个if语句的条件被认为是错误的。以下if语句是等价的:

    if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {

    print("\(firstNumber) < \(secondNumber) < 100")

    }

    // Prints "4 < 42 < 100"

    if let firstNumber = Int("4") {

    if let secondNumber = Int("42") {

    if firstNumber < secondNumber && secondNumber < 100 {

    print("\(firstNumber) < \(secondNumber) < 100")

    }

    }

    }

    // Prints "4 < 42 < 100"

    注意

    在if语句中使用可选绑定创建的常量和变量仅在if语句的主体中可用。相反,使用guard语句创建的常量和变量在Guard语句后面的代码行中可用,如Early Exit中所述。

    隐式解包选项

    如上所述,可选项表示允许常量或变量具有“无值”。可以使用if语句检查选项,以查看是否存在值,并且可以使用可选绑定有条件地解包,以访问可选值(如果存在)。

    有时候从程序的结构中可以清楚地看到,在第一次设置值之后,可选项将始终有一个值。在这些情况下,每次访问时都不必检查和打开可选的值,因为可以安全地假定所有时间都有值。

    这些选项被定义为隐式解包选项。通过在想要进行选择的类型后放置感叹号(String!)而不是问号(String?),可以编写一个隐式解包的可选项。

    当可选值被确定为在第一次定义可选值后立即存在,并且肯定可以假设其后每一点都存在时,隐式解包的可选值就很有用。 Swift中隐式展开选项的主要用途是在类初始化期间,如Unowned References和Unviousned Unwrapped Optional Properties中所述。

    隐式解包可选是幕后的普通可选,但也可以像非可选值一样使用,而不必在每次访问时解开可选值。以下示例显示了在以可显示的字符串形式访问其包装值时,可选字符串与隐式解包的可选字符串之间的行为差异:

    let possibleString: String? = "An optional string."

    let forcedString: String = possibleString! // requires an exclamation mark

    let assumedString: String! = "An implicitly unwrapped optional string."

    let implicitString: String = assumedString// no need for an exclamation mark

    你可以想象一个隐式解包的可选方案,因为只要使用它就可以自动解包可选的权限。 每次使用该名称时,不要在可选名称后面放置感叹号,而要在声明它时在可选类型后面放置感叹号。

    注意

    如果隐式解包的可选项为零,并且您尝试访问其包装的值,则会触发运行时错误。 结果与在不包含值的普通可选项后放置感叹号完全相同。

    你仍然可以像一个普通的可选项那样处理隐式解包的可选项,以检查它是否包含值:

    if assumedString != nil {

    print(assumedString!)

    }

    // Prints "An implicitly unwrapped optional string."

    你也可以使用一个带有可选绑定的隐式解包的可选方法,在一个语句中检查和打开它的值:

    if let definiteString = assumedString {

    print(definiteString)

    }

    // Prints "An implicitly unwrapped optional string."

    注意

    当稍后有可能变量为零时,不要使用隐式解包的可选项。 如果您需要在变量的生命周期中检查零值,则始终使用正常的可选类型。


    错误处理

    您可以使用错误处理来响应程序在执行过程中可能遇到的错误情况。

    与可以使用值的存在或不存在来传递函数的成功或失败的可选项相比,错误处理允许您确定失败的根本原因,并在必要时将错误传播到程序的另一部分。

    当函数遇到错误情况时,它会引发错误。 然后该函数的调用者可以捕获错误并做出适当的响应。

    func canThrowAnError() throws {

    // this function may or may not throw an error

    }

    函数指示它可以通过在其声明中包含throws关键字来引发错误。 当你调用一个可能引发错误的函数时,你需要在表达式中加上try关键字。

    Swift会自动将错误传播出当前范围,直到它们被catch子句处理。

    do {

    try canThrowAnError()

    // no error was thrown

    } catch {

    // an error was thrown

    }

    do语句创建一个新的包含范围,它允许将错误传播到一个或多个catch子句。

    以下是错误处理如何用于响应不同错误情况的示例:

    func makeASandwich() throws {

    // ...

    }

    do {

    try makeASandwich()

    eatASandwich()

    } catch SandwichError.outOfCleanDishes {

    washDishes()

    } catch SandwichError.missingIngredients(letingredients) {

    buyGroceries(ingredients)

    }

    在这个例子中,如果没有干净的盘子或缺少任何配料,makeASandwich()函数将会报错。因为makeASandwich()可能会引发错误,所以函数调用被包装在try表达式中。通过将函数调用包装在do语句中,抛出的任何错误都会传播到提供的catch子句。

    如果没有错误发生,则调用eatASandwich()函数。如果抛出一个错误并且它与SandwichError.outOfCleanDishes大小写匹配,那么将调用washDishes()函数。如果抛出一个错误,并且它与SandwichError.missingIngredients案件相匹配,则使用catch模式捕获的关联[String]值调用buyGroceries(_ :)函数。

    错误处理中详细介绍了投掷,捕捉和传播错误。

    断言和先决条件

    断言和先决条件是在运行时发生的检查。在执行任何进一步的代码之前,您可以使用它们来确保满足基本条件。如果断言或前提条件中的布尔条件评估为true,则代码继续照常执行。如果条件评估为false,则该程序的当前状态无效;代码执行结束,并且您的应用程序被终止。

    您使用断言和先决条件来表达您所做的假设和编码时的期望,以便您可以将它们包含在代码中。断言有助于您在开发过程中发现错误和不正确的假设,并且先决条件可帮助您检测生产中的问题。

    除了在运行时验证您的期望之外,断言和先决条件也成为代码中有用的文档形式。与上述错误处理中讨论的错误条件不同,断言和先决条件不用于可恢复或预期的错误。由于失败的断言或先决条件表示无效的程序状态,因此无法捕获失败的断言。

    使用断言和先决条件不能取代设计代码的方式,使得不可能出现无效条件。但是,使用它们来强制执行有效的数据和状态会导致应用程序在发生无效状态时更可预测地终止,并且有助于使问题更易于调试。一旦检测到无效状态,立即停止执行也有助于限制由该无效状态引起的损害。

    断言和先决条件之间的区别在于它们被检查时:断言仅在调试版本中检查,但在调试版本和生产版本中都检查了先决条件。在生产构建中,断言内的条件不被评估。这意味着您可以在开发过程中使用尽可能多的断言,而不会影响生产性能。

    使用断言进行调试

    你可以通过调用Swift标准库中的assert(_:_:file:line :)函数来编写断言。如果条件的结果为假,则将此函数传递给一个表达式,该表达式的值为true或false,并显示一条消息。例如:

    let age = -3

    assert(age >= 0, "A person's age can't be less than zero.")

    // This assertion fails because -3 is not >= 0.

    在这个例子中,如果age> = 0的计算结果为true,那么代码将继续执行,即如果age的值非负。 如果age的值是负数,如上面的代码所示,那么age> = 0的计算结果为false,并且断言失败,终止应用程序。

    你可以省略断言信息 - 例如,当它只是重复作为散文的条件。

    assert(age >= 0)

    如果代码已经检查了条件,则使用assertionFailure(_:file:line :)函数来指示断言失败。 例如:

    if age > 10 {

    print("You can ride the roller-coaster or the ferris wheel.")

    } else if age > 0 {

    print("You can ride the ferris wheel.")

    } else {

    assertionFailure("A person's age can't be less than zero.")

    }

    执行先决条件

    只要条件有可能为假,就要使用前提条件,但必须对代码继续执行而言必须如此。 例如,使用前提条件检查下标是否超出界限,或者检查函数是否已传递有效值。

    您通过调用前提条件precondition(_:_:file:line:)函数来编写前提条件。 如果条件的结果为假,则将此函数传递给一个表达式,该表达式的值为true或false,并显示一条消息。 例如:

    // In the implementation of a subscript...

    precondition(index > 0, "Index must be greater than zero.")

    您也可以调用preconditionFailure(_:file:line :)函数来指示发生了故障 - 例如,如果采取了开关的默认情况,但所有有效的输入数据都应由交换机的其中一个处理 其他情况。

    注意

    如果以非检查模式编译(-Ounchecked),则不会检查前提条件。 编译器假定前提条件始终为真,并相应地优化您的代码。 但是,无论优化设置如何,fatalError(_:file:line :)函数总是会暂停执行。

    通过将fatalError(“Unimplemented”)作为存根实现,您可以在原型设计和早期开发中使用fatalError(_:file:line :)函数为尚未实现的功能创建存根。 由于致命错误永远不会被优化,与断言或前提条件不同,您可以确保执行始终在遇到存根实现时暂停。

    ,