zoukankan      html  css  js  c++  java
  • Swift5.3 语言参考(五) 语句

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9740375.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    在Swift中,有三种语句:简单语句,编译器控制语句和控制流语句。简单语句是最常见的,由表达式或声明组成。编译器控制语句允许程序更改编译器行为的各个方面,并包括条件编译块和行控制语句。

    控制流语句用于控制程序中的执行流程。Swift中有几种类型的控制流语句,包括循环语句,分支语句和控制转移语句。循环语句允许重复执行代码块,分支语句允许仅在满足某些条件时执行某个代码块,并且控制传输语句提供了一种改变代码执行顺序的方法。此外,Swift提供了一个do语句来介绍范围,捕获和处理错误,以及defer在当前作用域退出之前运行清理操作语句。

    分号(;)可以选择出现在任何语句之后,如果它们出现在同一行上,则用于分隔多个语句。

     1 GRAMMAR OF A STATEMENT
     2 
     3 statement → expression ;opt
     4 
     5 statement → declaration ;opt
     6 
     7 statement → loop-statement ;opt
     8 
     9 statement → branch-statement ;opt
    10 
    11 statement → labeled-statement ;opt
    12 
    13 statement → control-transfer-statement ;opt
    14 
    15 statement → defer-statement ;opt
    16 
    17 statement → do-statement ;opt
    18 
    19 statement → compiler-control-statement
    20 
    21 statements → statement statements opt

    循环语句

    循环语句允许重复执行代码块,具体取决于循环中指定的条件。Swift有三个循环语句:a forin语句,while语句和repeatwhile语句。

    循环语句中的控制流可以通过break语句和语句进行更改,continue并在下面的Break语句Continue语句讨论

    1 GRAMMAR OF A LOOP STATEMENT
    2 
    3 loop-statement → for-in-statement
    4 
    5 loop-statement → while-statement
    6 
    7 loop-statement → repeat-while-statement

    For-In声明

    forin语句允许的代码块,以一次一个集合(或任何类型的)在一个符合每个项目来执行Sequence协议。

    一个forin语句具有以下形式:

    1 for item in collection {
    2     statements
    3 }

    makeIterator()集合表达式上调用方法以获取迭代器类型的值,即符合IteratorProtocol协议的类型程序通过调用next()迭代器上的方法开始执行循环如果返回的值不是nil,则将其分配给模式,程序执行语句,然后在循环开始时继续执行。否则,程序不执行赋值或执行语句,并且完成执行forin语句。

    1 GRAMMAR OF A FOR-IN STATEMENT
    2 
    3 for-in-statement → for caseopt pattern in expression where-clause opt code-block

    while语句

    一个while语句允许,只要一个条件不再成立时需要重复执行的代码块。

    一个while语句具有以下形式:

    1 while condition {
    2     statements
    3 }

    一个while语句的执行过程如下:

    1. 条件进行评价。

      如果true,执行继续执行步骤2.如果false,程序完成执行while语句。

    2. 程序执行语句,执行返回步骤1。

    因为在执行语句之前评估条件的值,所以语句中的语句可以执行零次或多次。while

    条件的值必须是Bool桥接的类型或类型Bool条件也可以是可选的绑定声明,如Optional Binding中所述

     1 GRAMMAR OF A WHILE STATEMENT
     2 
     3 while-statement → while condition-list code-block
     4 
     5 condition-list → condition | condition , condition-list
     6 
     7 condition → expression | availability-condition | case-condition | optional-binding-condition
     8 
     9 case-condition → case pattern initializer
    10 
    11 optional-binding-condition → let pattern initializer | var pattern initializer

    repeatwhile语句

    repeatwhile语句允许要执行的代码块一次或多次,只要条件保持为真。

    一个repeatwhile语句具有以下形式:

    1 repeat {
    2     statements
    3 } while condition

    一个repeatwhile语句的执行过程如下:

    1. 程序执行语句,并继续执行步骤2。

    2. 条件进行评价。

      如果true,执行返回到步骤1.如果false,程序完成执行repeatwhile语句。

    因为值条件后评估语句的执行,报表repeatwhile语句中至少执行一次。

    条件的值必须是Bool桥接的类型或类型Bool条件也可以是可选的绑定声明,如Optional Binding中所述

    1 GRAMMAR OF A REPEAT-WHILE STATEMENT
    2 
    3 repeat-while-statement → repeat code-block while expression

    分支语句

    分支语句允许程序根据一个或多个条件的值执行代码的某些部分。branch语句中指定的条件值控制程序如何分支,从而控制执行的代码块。Swift有三个分支语句:if语句,guard语句和switch语句。

    if语句或switch语句中的控制流可以通过break语句更改,并在下面的Break语句讨论

    1 GRAMMAR OF A BRANCH STATEMENT
    2 
    3 branch-statement → if-statement
    4 
    5 branch-statement → guard-statement
    6 
    7 branch-statement → switch-statement

    If语句

    if语句用于基于一个或多个条件的计算执行代码。

    声明有两种基本形式if在每种形式中,都需要打开和关闭支撑。

    第一种形式允许代码仅在条件为真时执行并具有以下形式:

    1 if condition {
    2     statements
    3 }

    第二种形式的if语句提供了一个额外的else子句(由else关键字引入),用于在条件为真时执行代码的一部分,在相同条件为假时用于执行另一部分代码。当存在单个else子句时,if语句具有以下形式:

    1 if condition {
    2     statements to execute if condition is true
    3 } else {
    4     statements to execute if condition is false
    5 }

    if语句的else子句可以包含另一个if语句来测试多个条件。if以这种方式链接在一起声明具有以下形式:

    1 if condition 1 {
    2     statements to execute if condition 1 is true
    3 } else if condition 2 {
    4     statements to execute if condition 2 is true
    5 } else {
    6     statements to execute if both conditions are false
    7 }

    if语句中任何条件的值必须是类型Bool或桥接到的类型Bool条件也可以是可选的绑定声明,如Optional Binding中所述

    1 GRAMMAR OF AN IF STATEMENT
    2 
    3 if-statement → if condition-list code-block else-clause opt
    4 
    5 else-clause → else code-block | else if-statement

    guard语句

    guard语句用于如果一个或多个条件没有满足转移程序控制出范围。

    一个guard语句具有以下形式:

    1 guard condition else {
    2     statements
    3 }

    guard语句中任何条件的值必须是类型Bool或桥接类型Bool条件也可以是可选的绑定声明,如Optional Binding中所述

    guard语句条件中为可选绑定声明赋值的任何常量或变量都可以用于guard语句的封闭范围的其余部分。

    语句else子句guard是必需的,并且必须Never使用以下语句之一调用具有返回类型的函数或在guard语句的封闭范围之外传递程序控制:

    • return
    • break
    • continue
    • throw

    控制转移语句中讨论的控制转移语句之下。有关Never返回类型的函数的更多信息,请参见永不返回的函数

    1 GRAMMAR OF A GUARD STATEMENT
    2 
    3 guard-statement → guard condition-list else code-block

    switch语句

    switch语句允许的代码中的某些块以根据控制表达式的值来执行。

    一个switch语句具有以下形式:

     1 switch control expression {
     2 case pattern 1:
     3     statements
     4 case pattern 2 where condition:
     5     statements
     6 case pattern 3 where condition,
     7      pattern 4 where condition:
     8     statements
     9 default:
    10     statements
    11 }

    评估语句控制表达式switch然后与每种情况下指定的模式进行比较。如果找到匹配项,程序将执行该案例范围内列出语句每个案例的范围不能为空。因此,您必须在:每个案例标签的冒号(后面至少包含一个语句break如果您不打算在匹配案例的正文中执行任何代码,请使用单个语句。

    代码可以分支的表达式的值非常灵活。例如,除了标量类型的值(例如整数和字符)之外,您的代码还可以分支任何类型的值,包括浮点数,字符串,元组,自定义类的实例和选项。所述的值对照表达甚至可以匹配到一个枚举的情况下的值,并检查包含在值的指定范围。有关如何在使用这些不同类型的值的实例switch说明,请参阅交换机控制流

    一个switch案例可以选择where在每个模式之后包含一个子句。where子句是由所引入的where关键字随后的表达式,用于提供一个附加条件的情况下的图案被认为是前匹配于控制表达如果存在where子句,则仅当控件表达式的值与案例的某个模式匹配且子句的表达式值时,才会执行相关案例中语句例如,只有当控件表达式是包含两个具有相同值的元素的元组时,控件表达式才匹配下面示例中的情况,例如wheretrue(1, 1)

    case let (x, y) where x == y:

    如上例所示,case中的模式也可以使用let关键字绑定常量(它们也可以使用var关键字绑定变量)。然后可以在相应的where子句中以及在案例范围内的其余代码中引用这些常量(或变量)如果案例包含与控制表达式匹配的多个模式,则所有模式必须包含相同的常量或变量绑定,并且每个绑定变量或常量必须在所有案例的模式中具有相同的类型。

    一个switch语句也可以包含一个默认的情况下,通过引入的default关键字。仅当没有其他情况与控制表达式匹配时,才会执行默认情况下的代码。一个switch声明只能包含一个默认的情况下,必须出现在结束switch发言。

    虽然模式匹配操作的实际执行顺序,特别是案例中模式的评估顺序未指定,但switch语句中的模式匹配表现得好像评估是按源顺序执行的 - 即它们出现的顺序在源代码中。因此,如果多个案例包含评估为相同值的模式,因此可以匹配控制表达式的值,则程序仅按源顺序执行第一个匹配案例中的代码。

    switch语句必须是详尽的

    在Swift中,控件表达式类型的每个可能值必须与案例的至少一个模式的值匹配。如果这根本不可行(例如,当控制表达式的类型为Int)时,您可以包含一个默认大小写以满足要求。

    执行不会隐瞒案件

    在匹配的案例中的代码完成执行后,程序退出该switch语句。程序执行不会继续或“落到”下一个案例或默认情况。也就是说,如果您希望执行从一个案例继续到下一个案例,请明确包含一个fallthrough语句,该语句只包含fallthrough关键字,在您希望继续执行的情况下。有关该fallthrough语句的更多信息,请参阅下面的Fallthrough Statement

     1 GRAMMAR OF A SWITCH STATEMENT
     2 
     3 switch-statement → switch expression { switch-cases opt }
     4 
     5 switch-cases → switch-case switch-cases opt
     6 
     7 switch-casecase-label statements
     8 
     9 switch-casedefault-label statements
    10 
    11 switch-case → conditional-switch-case
    12 
    13 case-label → case case-item-list :
    14 
    15 case-item-list → pattern where-clause opt | pattern where-clause opt , case-item-list
    16 
    17 default-label → default :
    18 
    19 where-clause → where where-expression
    20 
    21 where-expression → expression
    22 
    23 conditional-switch-caseswitch-if-directive-clause switch-elseif-directive-clauses opt switch-else-directive-clause opt endif-directive
    24 
    25 switch-if-directive-clause → if-directive compilation-condition switch-cases opt
    26 
    27 switch-elseif-directive-clauses → elseif-directive-clause switch-elseif-directive-clauses opt
    28 
    29 switch-elseif-directive-clause → elseif-directive compilation-condition switch-cases opt
    30 
    31 switch-else-directive-clause → else-directive switch-cases opt

    标签语句

    您可以为循环语句,if语句,switch语句或do带有语句标签语句添加前缀,该语句标签由标签名称后面跟冒号(:)组成。使用带有breakcontinue语句的语句标签可以明确地说明如何在循环语句或switch语句中更改控制流,如下面的Break StatementContinue Statement中所述。

    标签语句的范围是语句标签后面的整个语句。您可以嵌套带标签的语句,但每个语句标签的名称必须是唯一的。

    欲了解更多信息,看看如何使用语句标签示例,请参阅标签的语句中的控制流

     1 GRAMMAR OF A LABELED STATEMENT
     2 
     3 labeled-statement → statement-label loop-statement
     4 
     5 labeled-statement → statement-label if-statement
     6 
     7 labeled-statement → statement-label switch-statement
     8 
     9 labeled-statement → statement-label do-statement
    10 
    11 statement-label → label-name :
    12 
    13 label-name → identifier

    控制转移声明

    控制转移语句可以通过无条件地将程序控制从一段代码转移到另一段代码来改变程序中代码的执行顺序。Swift有五个控制转移语句:break语句,continue语句,fallthrough语句,return语句和throw语句。

     1 GRAMMAR OF A CONTROL TRANSFER STATEMENT
     2 
     3 control-transfer-statement → break-statement
     4 
     5 control-transfer-statement → continue-statement
     6 
     7 control-transfer-statement → fallthrough-statement
     8 
     9 control-transfer-statement → return-statement
    10 
    11 control-transfer-statement → throw-statement

    break语句

    break语句结束一个循环,一个程序执行if的语句,或一个switch语句。一个break语句可以只由的break关键字,也可以由该的break关键字后面声明标签的名称,如下图所示。

    1 break
    2 break label name

    break语句后跟语句标签的名称时,它将结束由该标签命名的循环,if语句或switch语句的程序执行

    如果break语句后面没有语句标签的名称,它将结束switch语句的程序执行或发生它的最内层的封闭循环语句。您不能使用未标记的break语句来突破if语句。

    在这两种情况下,程序控制然后转移到封闭循环或switch语句之后的第一行代码(如果有的话)。

    有关如何使用的例子break声明,请参阅断裂标签的语句中的控制流

    1 GRAMMAR OF A BREAK STATEMENT
    2 
    3 break-statement → break label-name opt

    continue语句

    一个continue语句结束循环语句的当前迭代的程序执行,但不停止循环语句的执行。一个continue语句可以只由的continue关键字,也可以由该的continue关键字后面声明标签的名称,如下图所示。

    1 continue
    2 continue label name

    continue语句后跟语句标签的名称时,它将结束由该标签命名的循环语句的当前迭代的程序执行。

    continue语句后面没有语句标签的名称时,它结束程序执行它发生的最里面的封闭循环语句的当前迭代。

    在这两种情况下,程序控制然后被转移到封闭循环语句的条件。

    for语句中,在continue执行语句之后仍然会计算递增表达式,因为在执行循环体之后会计算递增表达式。

    有关如何使用的例子continue声明,请参阅继续标签的语句中的控制流

    1 GRAMMAR OF A CONTINUE STATEMENT
    2 
    3 continue-statement → continue label-name opt

    fallthrough语句

    fallthrough语句由的fallthrough关键字和只发生在一个的情况下的块switch语句。一个fallthrough语句导致程序从一个情况下,继续在switch陈述了下情况。即使案例标签的模式与switch语句的控制表达式的值不匹配,程序也会继续执行下一种情况

    一个fallthrough语句可以在里面任何地方出现switch的语句,而不是仅仅作为一个案例块的最后声明,但它不能在最后一种情况块中使用。它也不能将控制转移到其模式包含值绑定模式的大小写块中。

    有关如何使用的例子fallthrough在一份声明中switch声明,请参阅控制转移语句的控制流

    1 GRAMMAR OF A FALLTHROUGH STATEMENT
    2 
    3 fallthrough-statement → fallthrough

    return语句

    return语句发生在函数或方法的定义和原因程序执行的主体返回到调用函数或方法。程序执行在函数或方法调用之后的紧接点继续。

    return语句可以仅由的return关键字,或者它可以由所述的return关键字后跟表达式,如下所示。

    1 return
    2 return expression

    return语句后跟表达式时,表达式的值将返回给调用函数或方法。如果表达式的值与函数或方法声明中声明的返回类型的值不匹配,则表达式的值在返回到调用函数或方法之前将转换为返回类型。

    注意

    Failable Initializers中所述,可以在可用的初始化程序中使用特殊形式的returnstatement()来指示初始化失败。return nil

    return语句后面没有表达式时,它只能用于从不返回值的函数或方法返回(也就是说,当函数或方法的返回类型为Void或时())。

    1 GRAMMAR OF A RETURN STATEMENT
    2 
    3 return-statement → return expression opt

    Throw语句

    throw语句发生在一个投掷函数或方法的主体中,或在一闭合表达式,其类型被标与主体throws关键字。

    throw语句导致程序来结束当前范围执行和开始错误传播到其封闭的范围。抛出的错误继续传播,直到它由语句catch子句处理do

    throw语句由的throw关键字后跟一个表达式,如下所示。

    throw expression

    表达式的值必须具有符合Error协议的类型

    有关如何使用throw语句的示例,请参阅错误处理中使用投掷函数传播错误

    1 GRAMMAR OF A THROW STATEMENT
    2 
    3 throw-statement → throw expression

    defer语句

    defer语句用于只是传送该范围之外的控制程序之前,执行代码defer语句出现的地方

    一个defer语句具有以下形式:

    1 defer {
    2     statements
    3 }

    defer无论程序控制如何转移,都会执行语句中的语句。这意味着defer可以使用语句来执行手动资源管理,例如关闭文件描述符,以及执行即使抛出错误也需要执行的操作。

    如果多个defer语句出现在同一范围内,则它们出现的顺序与执行顺序相反。首先执行defer给定范围中的最后一个语句意味着该最后一个defer语句中的语句可以引用将被其他defer语句清除的资源

    1 func f() {
    2     defer { print("First defer") }
    3     defer { print("Second defer") }
    4     print("End of function")
    5 }
    6 f()
    7 // Prints "End of function"
    8 // Prints "Second defer"
    9 // Prints "First defer"

    声明中的defer语句不能语句之外传递程序控制defer

    1 GRAMMAR OF A DEFER STATEMENT
    2 
    3 defer-statement → defer code-block

    do语句

    do语句用于引入新范围,并且可以选择包含一个或多个catch子句,这些子句包含与定义的错误条件匹配的模式。do语句范围内声明的变量和常量只能在该范围内访问。

    doSwift中语句类似于{}C中用于分隔代码块的花括号(),并且在运行时不会产生性能成本。

    一个do语句具有以下形式:

    1 do {
    2     try expression
    3     statements
    4 } catch pattern 1 {
    5     statements
    6 } catch pattern 2 where condition {
    7     statements
    8 }

    switch语句一样,编译器会尝试推断catch子句是否详尽无遗。如果可以做出这样的确定,则认为错误被处理。否则,错误可能会传播到包含范围之外,这意味着错误必须由封闭catch子句处理,或者必须声明包含函数throws

    要确保处理错误,请使用catch带有匹配所有错误的模式子句,例如通配符模式(_)。如果catch子句未指定模式,则catch子句匹配并将任何错误绑定到名为的本地常量error有关可在catch子句中使用的模式的更多信息,请参阅模式

    要查看如何使用do带有多个catch子句语句的示例,请参阅处理错误

    1 GRAMMAR OF A DO STATEMENT
    2 
    3 do-statement → do code-block catch-clauses opt
    4 
    5 catch-clauses → catch-clause catch-clauses opt
    6 
    7 catch-clause → catch pattern opt where-clause opt code-block

    编译器控制语句

    编译器控制语句允许程序更改编译器行为的各个方面。Swift有三个编译器控制语句:条件编译块,行控制语句和编译时诊断语句。

    1 GRAMMAR OF A COMPILER CONTROL STATEMENT
    2 
    3 compiler-control-statement → conditional-compilation-block
    4 
    5 compiler-control-statement → line-control-statement
    6 
    7 compiler-control-statement → diagnostic-statement

    条件编译块

    条件编译块允许根据一个或多个编译条件的值有条件地编译代码。

    每个条件编译块都以#if编译指令开头,以编译指令结束#endif一个简单的条件编译块具有以下形式:

    1 #if compilation condition
    2 statements
    3 #endif

    if语句的条件不同编译条件在编译时进行评估。因此,仅在编译条件评估到编译时才编译和执行语句true

    汇编条件可以包括truefalse布尔文字,与使用的标识符-D命令行标记,或者任何在下面的表中列出的平台的条件。

    平台条件有效参数
    os() macOSiOSwatchOStvOSLinux
    arch() i386x86_64armarm64
    swift() >= 后跟版本号
    compiler() >= 后跟版本号
    canImport() 模块名称
    targetEnvironment() simulator

    swift()compiler()平台条件的版本号由主号码,可选的次要号码,可选的补丁号码等组成,其中dot(.)分隔版本号的每个部分。>=版本号之间不能有空格compiler()无论传递给编译器的Swift版本设置如何,版本都是编译器版本。版本swift()是当前正在编译的语言版本。例如,如果在Swift 3模式下使用Swift 4.2编译器编译代码,则编译器版本为4.2,语言版本为3.3。使用这些设置,以下代码仅打印第一个和最后一个消息:

     1 #if compiler(>=4.2)
     2 print("Compiled with the Swift 4.2 compiler or later")
     3 #endif
     4 #if swift(>=4.2)
     5 print("Compiled in Swift 4.2 mode or later")
     6 #endif
     7 #if swift(>=3.0)
     8 print("Compiled in Swift 3.0 mode or later")
     9 #endif
    10 // Prints "Compiled with the Swift 4.2 compiler or later"
    11 // Prints "Compiled in Swift 3.0 mode or later"

    canImport()平台条件的参数是可能不存在于所有平台上的模块的名称。此条件测试是否可以导入模块,但实际上不导入它。如果模块存在,平台条件返回true否则,它返回false

    当为模拟器编译代码时targetEnvironment()平台条件返回true否则,它返回false

    注意

    对于ARM 64设备arch(arm)平台条件不会返回true为32位iOS模拟器编译代码时arch(i386)平台条件会返回true

    您可以使用逻辑运算符结合编译条件&&||以及!和使用括号进行分组。这些运算符与用于组合普通布尔表达式的逻辑运算符具有相同的关联性和优先级。

    if语句类似,您可以添加多个条件分支以测试不同的编译条件。您可以使用#elseif子句添加任意数量的其他分支您还可以使用#else子句添加最终的附加分支包含多个分支的条件编译块具有以下形式:

    1 #if compilation condition 1
    2 statements to compile if compilation condition 1 is true
    3 #elseif compilation condition 2
    4 statements to compile if compilation condition 2 is true
    5 #else
    6 statements to compile if both compilation conditions are false
    7 #endif

    注意

    即使未编译,也会解析条件编译块正文中的每个语句。但是,如果编译条件包含swift()平台条件,则会出现异常:仅当编译器的Swift版本与平台条件中指定的版本匹配时才会解析语句。此异常确保较旧的编译器不会尝试解析较新版本的Swift中引入的语法。

     1 GRAMMAR OF A CONDITIONAL COMPILATION BLOCK
     2 
     3 conditional-compilation-block → if-directive-clause elseif-directive-clauses opt else-directive-clause opt endif-directive
     4 
     5 if-directive-clause → if-directive compilation-condition statements opt
     6 
     7 elseif-directive-clauses → elseif-directive-clause elseif-directive-clauses opt
     8 
     9 elseif-directive-clause → elseif-directive compilation-condition statements opt
    10 
    11 else-directive-clause → else-directive statements opt
    12 
    13 if-directive → #if
    14 
    15 elseif-directive → #elseif
    16 
    17 else-directive → #else
    18 
    19 endif-directive → #endif
    20 
    21 compilation-condition → platform-condition
    22 
    23 compilation-condition → identifier
    24 
    25 compilation-condition → boolean-literal
    26 
    27 compilation-condition → ( compilation-condition )
    28 
    29 compilation-condition → ! compilation-condition
    30 
    31 compilation-condition → compilation-condition && compilation-condition
    32 
    33 compilation-condition → compilation-condition || compilation-condition
    34 
    35 platform-condition → os ( operating-system )
    36 
    37 platform-condition → arch ( architecture )
    38 
    39 platform-condition → swift ( >= swift-version )
    40 
    41 platform-condition → compiler ( >= swift-version )
    42 
    43 platform-condition → canImport ( module-name )
    44 
    45 platform-condition → targetEnvironment ( environment )
    46 
    47 operating-system → macOS | iOS | watchOS | tvOS
    48 
    49 architecture → i386 | x86_64 | arm | arm64
    50 
    51 swift-version → decimal-digits swift-version-continuation opt
    52 
    53 swift-version-continuation → . decimal-digits swift-version-continuation opt
    54 
    55 module-name → identifier
    56 
    57 environment → simulator

    行控制语句

    行控制语句用于指定行号和文件名,该行号和文件名可以与正在编译的源代码的行号和文件名不同。使用行控制语句更改Swift用于诊断和调试目的的源代码位置。

    行控制语句具有以下形式:

    1 #sourceLocation(file: filename, line: line number)
    2 #sourceLocation()

    行控制语句的第一种形式更改#line#file文字表达式的值,从行控制语句后面的代码行开始。行数的值变化#line并且是字面任何大于零的整数。文件名改变的值#file是一个字符串文字。

    行控制语句的第二种形式#sourceLocation(),将源代码位置重置为默认行号和文件名。

    1 GRAMMAR OF A LINE CONTROL STATEMENT
    2 
    3 line-control-statement → #sourceLocation ( file: file-name , line: line-number )
    4 
    5 line-control-statement → #sourceLocation ( )
    6 
    7 line-number → A decimal integer greater than zero
    8 
    9 file-name → static-string-literal

    编译时诊断语句

    编译时诊断语句会导致编译器在编译期间发出错误或警告。编译时诊断语句具有以下形式:

    1 #error("error message")
    2 #warning("warning message")

    第一种形式将错误消息作为致命错误发出,并终止编译过程。第二种形式将警告消息作为非致命警告发出,并允许继续编译。您将诊断消息编写为静态字符串文字。静态字符串文字不能使用字符串插值或连接等功能,但它们可以使用多行字符串文字语法。

    1 GRAMMAR OF A COMPILE-TIME DIAGNOSTIC STATEMENT
    2 
    3 diagnostic-statement → #error ( diagnostic-message )
    4 
    5 diagnostic-statement → #warning ( diagnostic-message )
    6 
    7 diagnostic-message → static-string-literal

    可靠性条件

    一个可靠性条件用作的条件ifwhileguard语句查询在运行时API的可用性,基于特定平台参数。

    可用性条件具有以下形式:

    1 if #available(platform name version, ..., *) {
    2     statements to execute if the APIs are available
    3 } else {
    4     fallback statements to execute if the APIs are unavailable
    5 }

    您可以使用可用性条件来执行代码块,具体取决于您要使用的API是否在运行时可用。当编译器验证该代码块中的API可用时,编译器将使用可用性条件中的信息。

    可用性条件采用逗号分隔的平台名称和版本列表。使用iOSmacOSwatchOS,和tvOS对于平台的名称,包括相应的版本号。*参数是必需的,并指定在任何其他平台上,由可用性条件保护的代码块的主体在目标指定的最小部署目标上执行。

    与布尔条件不同,您无法使用&&等逻辑运算符组合可用性条件||

     1 GRAMMAR OF AN AVAILABILITY CONDITION
     2 
     3 availability-condition → #available ( availability-arguments )
     4 
     5 availability-arguments → availability-argument | availability-argument , availability-arguments
     6 
     7 availability-argument → platform-name platform-version
     8 
     9 availability-argument → *
    10 
    11 platform-name → iOS | iOSApplicationExtension
    12 
    13 platform-name → macOS | macOSApplicationExtension
    14 
    15 platform-name → watchOS
    16 
    17 platform-name → tvOS
    18 
    19 platform-version → decimal-digits
    20 
    21 platform-version → decimal-digits . decimal-digits
    22 
    23 platform-version → decimal-digits . decimal-digits . decimal-digits

     

  • 相关阅读:
    C语言实现大数计算
    shell编程题(九)
    shell编程题(八)
    信号(一)
    shell编程题(六)
    C语言实现webServer
    chrome导入导出常用书签
    JdbcTemplate
    数据库连接池
    JDBC
  • 原文地址:https://www.cnblogs.com/strengthen/p/9740375.html
Copyright © 2011-2022 走看看