面试-关于Swift的10个问题。 第三部分

专业计划“ iOS开发人员” -使用Swift 5开发移动应用程序的5个月最佳实践。最好的毕业生有望在OTUS的12家合作公司的采访中,因此我们发布了“ iOS面试问题(Swift)”系列中最后一篇文章的译文,在此我们将考虑更多内容数十个问题,对您的就业有帮助​​的答案。


图片


1.什么是故障,可以在哪里使用?


  • 闭包是自包含的代码片段,可以将其作为参数传递给函数或在程序中使用。
  • Swift 中的闭包类似于C和Objective-C中的块,以及其他编程语言中的lambda。
  • 这与函数几乎相同,但是不必命名闭包。
  • 无需声明每个参数的类型,但是如果您声明了,则无需指定返回值的类型。

单击链接查看所有闭包语法选项。


2.什么是转义/不转义闭包?


@nonescaping(标准)闭包:


  • 当闭包在函数的参数中传递并在函数的主体执行和控制返回之前使用。
  • 函数完成后 ,传递的闭包将超出范围,并且不再存在于内存中。

@转义(失控)闭包:


  • 在函数参数中传递闭包并在函数体执行后使用并且控制返回时。
  • 函数完成后 ,传输的闭包将继续存在于作用域中并保留在内存中,直到闭包完成为止。 链接

3.指出Swift中可用的集合类型?


图片


  • 数组 -用于以有序形式存储多个相同类型的值。
  • 设置(设置) -用于以无序形式存储相同类型的不同值。
  • 字典 -用于以无序形式存储键值对。

4.在Swift中如何定义基类?


在Swift中,不继承自基类的类以及您在未指定超类的情况下定义的类将自动成为基类。


5.什么是反初始化器,如何用Swift编写?


在释放类实例占用的内存之前,立即声明反初始化程序。 反初始化器使用关键字deinit编写 。 如果需要在释放对象占用的内存之前执行任何操作或清理,则使用它。


例如 ,如果您创建一个自定义类来打开文件并向其中写入一些数据,则需要在释放该类实例占用的内存之前关闭该文件。


反初始化器的编写不带方括号 ,并且不接受任何参数。


deinit { //   } 

6.什么时候使用双问号“ ??”?


该运算符称为nil join运算符 。 如果选项为nil,则用于设置默认值。


 let a: String? = nil let b = "nil coalescing operator" let result = a ?? b print(result) //:"nil coalescing operator" 

  • 一个?? 如果b包含一个值,则b对其解压缩;如果a为nil,则b返回默认值b。
  • 表达式a始终具有可选类型。 表达式b必须与a内存储的类型匹配。

6.'?有什么区别? 还有'!'?


符号“?”


  1. 使用选项时,可以输入“?”。 在命令集(例如方法,属性和下标)前面。
  2. 如果值在“?”之前 等于零,那么“?”之后的所有内容 忽略,整个表达式的值变为nil。
  3. 否则,该选件将解压缩,并且所有在“?”之后的内容 作用于未包装的价值。
  4. 在这两种情况下,整个表达式的值都是可选的。

符号“!”


  1. 确保可选内容包含一个值之后,可以在可选名称的末尾添加感叹号(!)来访问其基本值。
  2. 感叹号实际上说:“我知道这个选择确实很重要; 请使用它。 ”
  3. 仅在绝对确定第一次访问隐式解压缩的选项很重要时,才使用它。

7. Swift中的类型别名是什么?


类型别名声明将现有类型的命名别名引入程序。 类型别名声明是使用typealias关键字声明的。


类型别名=现有类型


 typealias StudentName = String let name:StudentName = "Jack" 

您可以对Swift中的大多数类型使用typealias ,例如:


  • 内置类型 (例如String,Int)
  • 自定义类型 (例如,类,结构,枚举)
  • 复杂类型 (例如闭包)

8. Swift中的函数和方法有什么区别?


方法是与类,结构或枚举关联的函数。 这适用于实例方法和类型方法。


函数 -在全局范围内声明,不属于任何类型。


可以在类外部或在类/结构/枚举内部定义函数,而方法必须在类/结构/枚举内部定义并且是其一部分。


9.外部参数的语法是什么?


外部参数允许我们为函数参数命名,以使其用途更易于理解。


函数功效(基数a:整数, 指数 b:整数)->整数


*有时在调用函数时命名每个参数以指示传递给函数的每个参数的用途很有用。


如果希望函数的用户在调用函数时提供参数名称,则除了本地参数名称外,还要为每个参数定义一个外部参数名称。


10.是否可以在Swift中重新定义结构和枚举?


您不能继承结构或枚举的子类,也不能覆盖它们。 因为结构是一种值的类型,并且编译器需要在编译时知道其确切大小,所以无法进行覆盖。


要查找先前的部分,请 单击 链接 第1 部分第2部分有关闭包有关属性的链接


仅此而已! 我们确信翻译不仅对iOS开发人员课程的学生有用,而且对许多Habr用户也有用。 我们希望您能获得专业的成功,并期待下一批受版权保护的在线计划!

Source: https://habr.com/ru/post/zh-CN453644/


All Articles