Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
programiz-zh
提交
787dccc7
P
programiz-zh
项目概览
OpenDocCN
/
programiz-zh
9 个月 前同步成功
通知
0
Star
48
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
programiz-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
787dccc7
编写于
7月 07, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-07-07 17:58:23
上级
803c9d08
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
34 addition
and
34 deletion
+34
-34
docs/swift/35.md
docs/swift/35.md
+2
-2
docs/swift/37.md
docs/swift/37.md
+28
-28
docs/swift/38.md
docs/swift/38.md
+4
-4
未找到文件。
docs/swift/35.md
浏览文件 @
787dccc7
...
...
@@ -27,7 +27,7 @@ func attack() {
}
```
但是,当您尝试运行上述程序时,由于先前在中声明了
**'attack()'而在 Swift 中会出现编译时错误。 但是,另一种解决方案可能是为特定功能定义不同的功能名称,例如**
:
但是,当您尝试运行上述程序时,由于先前在中声明了
`attack()`
而在 Swift 中会出现编译时错误。 但是,另一种解决方案可能是为特定功能定义不同的功能名称,例如
:
```
swift
struct
Knife
{
...
...
@@ -55,7 +55,7 @@ func attackUsingGun(weapon:Gun) {
如果您不知道结构是什么,请不要担心。 现在,只需将其视为可以在编程中创建物理对象的对象,那么您就可以创建刀,枪和刀片。 如果您想了解更多信息,请参见
[
Swift Struct
](
http://test.com
)
。 如果没有,我们将在后面的章节中再次讨论。
此解决方案的唯一问题是,您需要记住函数名称以调用特定的攻击操作。 同样,随着等级的提高,玩家可能具有使用炸弹,手榴弹,
shot
弹枪等进行攻击的其他功能。
此解决方案的唯一问题是,您需要记住函数名称以调用特定的攻击操作。 同样,随着等级的提高,玩家可能具有使用炸弹,手榴弹,
散
弹枪等进行攻击的其他功能。
用不同的名称创建函数很耗时,并且增加了记住函数名称以调用它的开销。 总而言之,这不是直观的。
...
...
docs/swift/37.md
浏览文件 @
787dccc7
...
...
@@ -11,14 +11,14 @@
闭包主要用于两个原因:
1.
**完成块**
闭包可帮助您在某些任务完成执行时得到通知。 请参阅
[
关闭作为完成处理
程序
](
#completion
)
,以了解有关它的更多信息。
闭包可帮助您在某些任务完成执行时得到通知。 请参阅
[
关闭作为完成处理
器
](
#completion
)
,以了解有关它的更多信息。
2.
**高阶函数**
闭包可以作为高阶函数的输入参数传递。 高阶函数只是一种接受函数作为输入并返回类型函数的值作为输出的函数类型。
为此,最好使用闭包代替函数,因为闭包省略了
func
关键字和函数名,从而使代码更具可读性和简短性。
为此,最好使用闭包代替函数,因为闭包省略了
`func`
关键字和函数名,从而使代码更具可读性和简短性。
* * *
## 闭
合
语法
## 闭
包
语法
闭包表达式语法具有以下一般形式:
...
...
@@ -33,7 +33,7 @@
* * *
### 示例 1:简单
关闭
### 示例 1:简单
闭包
```
swift
let
simpleClosure
=
{
...
...
@@ -114,7 +114,7 @@ Hello, World! Program
在上面的程序中,我们将类型定义为
`simpleClosure: (String) -> (String)`
,因为 Swift 无法自动推断出返回值的闭包。 类型
`(String) -> (String)`
声明闭包采用类型
`String`
的输入,并返回类型
`String`
的值。
正如我们在
*Swift 函数*
中了解到的那样,闭包还使用
return
关键字
`return greeting`
返回一个值,并且返回值可以在变量/常量中分配为
`let result =`
。
正如我们在
*Swift 函数*
中了解到的那样,闭包还使用
`return`
关键字
`return greeting`
返回一个值,并且返回值可以在变量/常量中分配为
`let result =`
。
* * *
...
...
@@ -222,7 +222,7 @@ someSimpleFunction(msg:"Hello Swift Community!") {
让我们在示例中看一下。
### 示例 6:不使用
@autoclosure
进行关闭
### 示例 6:不使用
`@autoclosure`
进行关闭
```
swift
func
someSimpleFunction
(
someClosure
:()
->
(),
msg
:
String
)
{
...
...
@@ -279,13 +279,13 @@ Hello World! from closure
* * *
## 具有参数和返回值的自动闭
合
## 具有参数和返回值的自动闭
包
像普通的闭包一样,您可以将参数传递给自动闭包并从中返回值。 但是,即使您传递参数,它们也会被忽略并且不能在闭包内部使用。 这是因为您无法定义参数以将其用作
`{ arg in }`
。
因此,建议创建不带参数但可以返回值的自动关闭。 值是包装在其中的表达式。 让我们在下面的示例中看到这一点。
### 示例 8:具有返回值的自动闭
合
### 示例 8:具有返回值的自动闭
包
```
swift
func
someSimpleFunction
(
_
someClosure
:
@autoclosure
()
->
(
String
))
{
...
...
@@ -305,7 +305,7 @@ Good Morning
因此,当我们在函数内部调用
`someClosure()`
时,它返回了
**早安**
值。
### 示例 9:带参数的自动闭
合
### 示例 9:带参数的自动闭
包
```
swift
func
someSimpleFunction
(
_
someClosure
:
@autoclosure
(
String
)
->
(
String
))
{
...
...
@@ -323,9 +323,9 @@ Good Morning
在上面的程序中,我们定义了一个需要自动关闭的函数。 闭包采用
`String`
类型的值,并且还返回
`String`
类型的值。
像前面的示例一样,我们将自动闭包
**“ Good Morning”**
传递给函数,这是闭包的返回值。
像前面的示例一样,我们将自动闭包
`Good Morning`
传递给函数,这是闭包的返回值。
因此,即使自动关闭称为
`someClosure("Hello World")`
,它也不能接受任何参数,它仍会返回并打印
**早安**
。
因此,即使自动关闭称为
`someClosure("Hello World")`
,它也不能接受任何参数,它仍会返回并打印
`Good Morning`
。
* * *
...
...
@@ -411,7 +411,7 @@ func testFunctionWithNoEscapingClosure(myClosure:() -> Void) {
}
```
上面的代码返回警告,因为出现在
return 语句之后的语句(在我们的示例中为
`myClosure()`
)没有执行,因为 return
语句将程序的控制权转移给了函数调用者。
上面的代码返回警告,因为出现在
`return`
语句之后的语句(在我们的示例中为
`myClosure()`
)没有执行,因为
`return`
语句将程序的控制权转移给了函数调用者。
因此,我们如何测试,以便在函数返回后调用闭包。 如果将闭包调用放在异步操作中,则可以完成此操作。
...
...
@@ -432,13 +432,13 @@ func testFunctionWithNoEscapingClosure(myClosure:@escaping () -> Void) {
* * *
## 关闭为完成处理
程序
## 关闭为完成处理
器
完成处理
程序
是回调/通知,可让您在函数完成其任务时执行某些操作。
完成处理
器
是回调/通知,可让您在函数完成其任务时执行某些操作。
完成处理
程序
主要用于异步操作中,以便调用者可以知道操作何时完成,以便在操作完成后执行某些操作。
完成处理
器
主要用于异步操作中,以便调用者可以知道操作何时完成,以便在操作完成后执行某些操作。
### 示例 13:作为完成处理
程序
的闭包
### 示例 13:作为完成处理
器
的闭包
```
swift
func
doSomeWork
(
completion
:()
->
())
{
...
...
@@ -469,7 +469,7 @@ Other statements
上面的程序也可以使用结尾闭包重写为:
### 示例 14:尾随闭包作为完成处理
程序
### 示例 14:尾随闭包作为完成处理
器
```
swift
func
doSomeWork
(
completion
:()
->
())
{
...
...
@@ -489,7 +489,7 @@ print("Other statements")
* * *
### 完成处理
程序
如何工作?
### 完成处理
器
如何工作?
![
Closure as a completion handler
](
img/8e420d145dc573349532c0beade92ba1.png
"Closure as a completion handler"
)
...
...
@@ -503,11 +503,11 @@ print("Other statements")
5.
之后,程序控制再次返回到关闭调用,并执行语句
`print("after calling callback")`
,该语句在控制台中调用回调后输出
**。**
6.
函数内部的语句执行后,程序将控制权转移到函数调用
`doSomeWork()`
,然后执行下一个语句
`print("Other statements")`
,该语句在控制台中输出
**其他语句**
。
让我们来看一个更实际的示例,将闭包用作完成处理
程序
。
让我们来看一个更实际的示例,将闭包用作完成处理
器
。
* * *
### 示例 11:作为完成处理
程序
的闭包
### 示例 11:作为完成处理
器
的闭包
```
swift
var
closeButtonPressed
=
false
...
...
@@ -528,21 +528,21 @@ codeinPlayground { (msg) in
```
swift
Code
,
Take
a
Nap
and
Relax
```
在上面的程序中,我们声明了一个变量
`closeButtonPressed`
,该变量将模拟用户是否在游乐场上轻按了关闭按钮。 想想如果您按下关闭按钮,变量
`closeButtonPressed`
将是
`true`
。
函数
`
codeinPlayground
`
接受闭包作为参数
。
闭包
`
completion
`
接受
`
String
`
,
但不返回值
。
由于
`
closeButtonPressed
`
被分配了
`
false
`
,
因此
if
语句内的语句未执行且没有调用闭包
。
函数
`codeinPlayground`
接受闭包作为参数。 闭包
`completion`
接受
`String`
,但不返回值。 由于
`closeButtonPressed`
被分配了
`false`
,因此
`if`
语句内的语句未执行且没有调用闭包。
现在
,
如果将
`
closeButtonPressed
`
分配给
`
true
`
(
即
,
当用户按下关闭按钮时
)
作为
`
var
closeButtonPressed
=
true
`,
则会调用
if
执行和关闭语句
。
现在,如果将
`closeButtonPressed`
分配给
`true`
(即,当用户按下关闭按钮时)作为
`var closeButtonPressed = true`
,则会调用
`if`
执行和关闭语句。
当为变量
`
closeButtonPressed
`
分配
true
时
,
输出为
:
当为变量
`closeButtonPressed`
分配
`true`
时,输出为:
```
```
swift
Code
,
Take
a
Nap
and
Relax
Close
the
playground
```
swift
```
在这里
,
我们将闭包用作完成处理
程序
,
因为当用户点击关闭按钮时
,
我们不想在函数
`
codeinPlayground
`
中执行语句
,
而是通过调用闭包
`
completion
(
"Close the playground"
)
`
来完成其执行
。
在这里,我们将闭包用作完成处理
器
,因为当用户点击关闭按钮时,我们不想在函数
`codeinPlayground`
中执行语句,而是通过调用闭包
`completion("Close the playground")`
来完成其执行。
这样,我们就有机会处理与闭包语句内的函数相关的所有最终事件。 在本例中,我们在控制台中将消息输出为
`print(msg)`
。
```
\ No newline at end of file
docs/swift/38.md
浏览文件 @
787dccc7
#
斯威夫特 Typealias
#
Swift 类型别名
> 原文: [https://www.programiz.com/swift-programming/typealias](https://www.programiz.com/swift-programming/typealias)
...
...
@@ -30,7 +30,7 @@ typealias name = existing type
## 内置类型的别名
您可以将
typealias 用于所有内置数据类型,如 String,Int,Float
等。
您可以将
`typealias`
用于所有内置数据类型,如
`String`
,
`Int`
,
`Float`
等。
**例如**
:
...
...
@@ -44,7 +44,7 @@ typealias StudentName = String
let
name
:
StudentName
=
"Jack"
```
在不使用
typealias 的情况下,应将 string
类型的常量声明为:
在不使用
`typealias`
的情况下,应将
`string`
类型的常量声明为:
```
swift
let
name
:
String
=
"Jack"
...
...
@@ -56,7 +56,7 @@ let name:String = "Jack"
## 用户定义类型的类型别名
在许多情况下,您需要创建自己的数据类型。 假设您要创建一个表示
Student 的 Type
,则可以使用以下类来创建它:
在许多情况下,您需要创建自己的数据类型。 假设您要创建一个表示
`Student`
的
`Type`
,则可以使用以下类来创建它:
```
swift
class
Student
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录