iOS面试问题(快速)-第3部分
1.什么是封闭,我们可以在哪里使用?
- 它们是自包含的代码块 ,可以在代码中传递和使用。
- Swift中的闭包类似于C和Objective-C中的块以及 其他编程语言中的lambda 。
- 它们与函数几乎相同,但不一定具有名称。
- 无需声明每个参数的类型,如果这样做,则无需声明闭包的返回类型。
单击 链接 以了解所有类型的闭包语法。
2.什么是转义/不转义闭包?
@nonescaping闭包:(默认闭包)
- 当在函数的参数中传递闭包时,请在函数主体执行并返回编译器之前使用它。
- 当函数结束时 ,传递的闭包超出范围,并且在内存中不再存在。
@转义闭包: 。
- 在函数的参数中传递闭包时,请在函数体执行并返回编译器后使用它。
- 当函数结束时 ,传递的闭包的作用域存在并存在于内存中,直到执行闭包为止。 链接
3. 提到Swift中可用的集合类型是什么?
- 数组 -用于按顺序存储相同类型的多个值。
- 集 -用于以无序方式存储相同类型的不同值。
- 字典 —用于以无序方式存储具有键-值对关联的值。
4.如何在Swift中定义基类?
在Swift中,这些类不是从基类继承的,并且您在未指定其超类的情况下定义的类将自动成为基类。
5.什么是反初始化器以及如何用Swift编写?
在取消分配类实例之前立即声明一个反初始化器。 您使用deinit关键字编写反初始化器。 如果需要在取消分配对象之前执行某些操作或清理,请使用它。
例如 ,如果您创建一个自定义类来打开文件并向其中写入一些数据,则可能需要在释放该类实例之前关闭该文件。
反初始化器的编写没有任何括号 ,并且没有任何参数。
deinit {
//执行反初始化
}
6.双重问号“ ??”有什么用? ?
该运算符称为nil合并运算符 。当可选参数为nil时,我们使用它来提供默认值。
let a: String? = nil
let b = "let a: String? = nil
nil合并运算符
let b = ""
let result = a ?? b
print(result) //output:""
let result = a ?? b
print(result) //output:""
nil合并运算符
let result = a ?? b
print(result) //output:""
- 一种 ?? b取消包装可选的a(如果它包含一个值),或者返回默认值b(如果a为零)。
- 表达式a始终是可选类型。 表达式b必须匹配存储在a内的类型。
6.’?有什么区别? 和’!’ ?
“?”标记
1.使用可选值时,您可以输入“?” 在操作之前,例如方法,属性和下标。
2.如果值在“?”之前 是零, “?”之后的所有内容 将被忽略,整个表达式的值为nil。
3.否则,可选值将被解包,并且“?”之后的所有内容 作用于未包装的值。
4.在两种情况下,整个表达式的值都是一个可选值。
“!”马克
1.一旦确定可选选项确实包含一个值,就可以通过在可选名称的末尾添加一个感叹号(!)来访问其基础值。
2.感叹号有效地表示:“我知道此可选选项肯定具有价值; 请使用它。”
3.仅在绝对确定隐式解开的可选项在首次访问时具有值的情况下使用。
7.在Swift中什么是类型别名?
类型别名声明将现有类型的命名别名引入程序。 类型别名声明是使用关键字typealias声明的。
类型别名=现有类型
typealias StudentName =字符串
让名字:StudentName =“杰克”
在Swift中,您可以对大多数类型使用typealias 。 它们可以是:
- 内置类型 (例如:字符串,整数)
- 用户定义的类型 (例如:类,结构,枚举)
- 复杂类型 (例如:闭包)
8. Swift中的函数和方法有什么区别?
方法 —是与类,结构或枚举关联的函数。 这适用于实例方法和类型方法。
函数 —在全局范围内声明,不属于任何类型。
函数可以在类外部定义,也可以在类/结构/枚举内部定义,而方法必须在类/结构/枚举内部或部分定义。
9.外部参数的语法是什么?
外部参数 -允许我们命名函数参数以使其用途更加清楚。
函数功效(基数a:整数, 指数 b:整数)->整数
有时在调用函数时命名每个参数很有用,以指示传递给函数的每个参数的用途。
如果希望函数的用户在调用函数时提供参数名称,则除了本地参数名称外,还要为每个参数定义一个外部参数名称。
10. 您可以在Swift中重写结构和枚举吗?
我们不能继承struct / enum,无法覆盖。 因为,struct是值类型,所以编译器需要在编译时知道struct的确切大小,这是不可能的。