★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(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 for
- in
语句,while
语句和repeat
- while
语句。
循环语句中的控制流可以通过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声明
甲for
- in
语句允许的代码块,以一次一个集合(或任何类型的)在一个符合每个项目来执行Sequence
协议。
一个for
- in
语句具有以下形式:
1 for item in collection { 2 statements 3 }
makeIterator()
在集合表达式上调用该方法以获取迭代器类型的值,即符合IteratorProtocol
协议的类型。程序通过调用next()
迭代器上的方法开始执行循环。如果返回的值不是nil
,则将其分配给项模式,程序执行语句,然后在循环开始时继续执行。否则,程序不执行赋值或执行语句,并且完成执行for
- in
语句。
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
语句的执行过程如下:
-
的条件进行评价。
如果
true
,执行继续执行步骤2.如果false
,程序完成执行while
语句。 -
程序执行语句,执行返回步骤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
repeat
- while
语句
repeat
- while
语句允许要执行的代码块一次或多次,只要条件保持为真。
一个repeat
- while
语句具有以下形式:
1 repeat { 2 statements 3 } while condition
一个repeat
- while
语句的执行过程如下:
-
程序执行语句,并继续执行步骤2。
-
的条件进行评价。
如果
true
,执行返回到步骤1.如果false
,程序完成执行repeat
-while
语句。
因为值条件后评估语句的执行,报表中repeat
- while
语句中至少执行一次。
条件的值必须是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
子句,则仅当控件表达式的值与案例的某个模式匹配且子句的表达式求值时,才会执行相关案例中的语句。例如,只有当控件表达式是包含两个具有相同值的元素的元组时,控件表达式才匹配下面示例中的情况,例如。where
true
(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-case → case-label statements 8 9 switch-case → default-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-case → switch-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
带有语句标签的语句添加前缀,该语句标签由标签名称后面跟冒号(:)组成。使用带有break
和continue
语句的语句标签可以明确地说明如何在循环语句或switch
语句中更改控制流,如下面的Break Statement和Continue 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中所述,可以在可用的初始化程序中使用特殊形式的return
statement()来指示初始化失败。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
语句范围内声明的变量和常量只能在该范围内访问。
do
Swift中的语句类似于{}
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
的汇编条件可以包括true
和false
布尔文字,与使用的标识符-D
命令行标记,或者任何在下面的表中列出的平台的条件。
平台条件 | 有效参数 |
---|---|
os() |
macOS ,iOS ,watchOS ,tvOS ,Linux |
arch() |
i386 ,x86_64 ,arm ,arm64 |
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
可靠性条件
一个可靠性条件用作的条件if
,while
和guard
语句查询在运行时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可用时,编译器将使用可用性条件中的信息。
可用性条件采用逗号分隔的平台名称和版本列表。使用iOS
,macOS
,watchOS
,和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