快速面试问题–克里希纳

快速面试问题

1) Swift和Objective C之间的差异

Swift是用于iOS,macOS,watchOS和tvOS应用程序开发的新编程语言。 尽管如此,从您在C和Objective-C方面的开发经验中,Swift的许多部分都会为您所熟悉。

Swift提供了自己的所有基本C和Objective-C类型的版本,包括Int表示整数,Doubleand Float表示浮点值,Bool表示布尔值和String表示文本数据。 Swift还提供了三种主要集合类型(数组,集合和字典)的强大版本。

1. Swift引入了在Objective-C中找不到的高级类型,例如元组(值的分组)。您可以使用元组从一个函数返回多个值作为单个复合值。

2. Swift还引入了可选类型,用于处理缺少值的情况。 可选参数说“有一个值,它等于x ”或“根本没有值”。 它们适用于任何类型,而不仅仅是类。 使用可选选项类似于在Objective-C中对指针使用nil

3. Swift是一种类型安全的语言,如果代码的一部分需要一个String,则类型安全可防止您错误地将其传递给Int。同样,类型安全可防止您将可选的String意外地传递给期望的代码一个非可选的字符串。 类型安全性可帮助您在开发过程中尽早发现并修复错误。

4. Swift更易于阅读:不再需要用分号来结束行或括号,Swift中的方法和函数调用在括号内使用行业标准的逗号分隔参数列表。Swift代码更类似于自然英语

5. Swift易于维护: Swift将Objective-C标头(.h)和实现文件(.m)合并为一个代码文件(.swift)。

6. Swift更安全:

7. Swift与内存管理统一:在目标C中,开发人员有责任通过使用低级API(如Core图形)来管理内存处理。

与Swift中一样,即使在底层API中也无需考虑内存管理。

8. Swift需要更少的代码

9. Swift更快

10.Swift Playgrounds鼓励交互式编码: Playgrounds使程序员能够测试新的算法或图形例程,例如5至20行代码,而不必创建整个iPhone应用程序。

2) 类型安全和类型推断:

Swift是一种类型安全的语言。 类型安全的语言鼓励您清楚代码可以使用的值的类型。 如果代码的一部分需要一个字符串,则不能错误地将其传递给Int,它会在编译代码时执行类型检查并将所有不匹配的类型标记为错误。

如果您没有指定所需的值类型,则Swift会使用类型推断来得出适当的类型。

当声明具有初始值的常量或变量时,类型推断特别有用。

3) 什么是类型别名

类型别名为现有类型定义备用名称。 您可以使用typealias关键字定义类型别名。

4) 什么是元组:

组将多个值分组为一个复合值。 元组中的值可以是任何类型,而不必彼此相同。

元组作为函数的返回值特别有用。 尝试检索网页的函数可能会返回(Int,String)元组类型,以描述页面检索的成功或失败。 通过返回具有两个不同值(每个类型均不同)的元组,该函数提供的结果要比仅返回单个类型的单个值要有用得多。

5) 什么是可选:

您可以在不存在值的情况下使用可选选项 。 可选选项代表两种可能性:要么有一个值,要么可以打开该可选选项以访问该值,或者根本没有任何值。

可选的Int被写为Int ?,而不是Int。 问号表示它包含的值是可选的,这意味着它可能包含一些 Int值,或者可能根本不包含任何值

注意: Swift的nil与Objective-C中的nil不同。 在Objective-C中,nil是指向不存在对象的指针。 在Swift中,nil不是指针-它缺少某种类型的值。 可以将任何类型的Optionals设置为nil,而不仅仅是对象类型。

6) 什么是强制展开:

一旦确定可选选项确实包含一个值,就可以通过在可选名称的末尾添加一个感叹号(!)来访问其基础值。 感叹号有效地表示:“我知道此可选选项绝对有价值。 请使用它。”这称为可选值的强制展开

7) 什么是可选绑定:

您可以使用可选绑定来确定可选对象是否包含值,如果包含,则使该值可用作临时常量或变量。 可选绑定可以与if和while语句一起使用,以检查可选内部的值,并将该值提取到常量或变量中。

您可以根据需要在单个if语句中包含尽可能多的可选绑定和布尔条件,并用逗号分隔。 如果可选绑定中的任何值均为nil或任何布尔条件求值为false,则将整个if语句的条件视为false。

为if语句编写一个可选的绑定,如下所示:

如果让constantName = someOptional {………}

如果让tempVal1 = testNil,让tempVal2 = testNil1,让testVal3 = testNil2 {}

8) 隐式展开的可选:

有时,从程序的结构中可以明显看出,在设置了可选值之后,可选值将始终具有该值。 在这些情况下,删除每次访问可选值时都不需要检查和取消包装的值很有用,因为可以安全地假定它始终都具有值。

这些类型的可选定义为隐式解包的可选 。 您通过在要使其为可选的类型之后放置感叹号(String!)而不是问号(String?)来编写隐式解包的可选。

让forceOptional:Int? = 11

让implicitOptional:Int! = 12

打印(强制可选!)

打印(隐式可选)

9) 可选链接:

可选链接是一种Swift功能,它允许语句的执行在任何时候停止并返回nil。

可选链接是一个查询和调用当前可能为零的可选属性,方法和下标的过程。 如果可选包含值,则属性,方法或下标调用成功;否则,调用成功。 如果可选值为nil,则属性,方法或下标调用将返回nil。 可以将多个查询链接在一起,如果链中的任何链接为nil,则整个链都会正常失败。

例如:superview?.gestureRecongnizers?.first

10)什么是零合并运算符:

如果nil-coalescing运算符 (a ?? b)包含值,则解开可选的a;如果a为nil,则返回默认值b。

如果可以,请使用值A,但如果值A为零,则请使用值B。

这对于可选项特别有用,因为它可以有效地阻止它们成为可选项,因为您提供了非可选值B。因此,如果A是可选项并且具有值,则将使用它(我们有一个值)。没有值,B被使用(所以我们仍然有一个值)。 无论哪种方式,我们绝对都有价值。

让someValue = a ?? “ DefaluleValue”

11)什么是字符串插值:

字符串插值是通过将常量,变量,文字和表达式的值包含在字符串文字中来构造新的String值的方法。 您插入字符串文字中的每个项目都用一对括号括起来,并以反斜杠(\)为前缀:

12)快速集合:

Swift提供了三种主要的集合类型 ,称为数组,集合和字典,用于存储值的集合。 数组是值的有序集合。 集是唯一值的无序集合。 字典是键-值关联的无序集合。

集合集合中存储相同类型的不同值,没有定义的顺序。 当项目的顺序不重要时,或者需要确保某个项目仅出现一次时,可以使用集合而不是数组。

类型必须是可哈希的才能存储在集合中,也就是说,该类型必须提供一种为其自身计算哈希值的方法。 哈希值是一个Int值,对于所有相等比较的对象都是相同的,因此,如果a == b,则它遵循a.hashValue == b.hashValue。

13)警卫有什么用? (早出)

与if语句一样,guard语句根据表达式的布尔值执行语句。 您使用保护声明要求条件必须为true,以便执行保护声明之后的代码。 与if语句不同,guard语句始终具有else子句-如果条件不成立,则执行else子句中的代码。

14)快速功能:

函数是执行特定任务的独立代码块。

func someFunction(argumentLabel parameterName:Int){}

15)可变参数:

可变参数接受零个或多个指定类型的值。 您可以使用可变参数来指定在调用函数时可以向该参数传递不同数量的输入值。 通过在参数的类型名称后插入三个句点字符(…)来编写可变参数。

注意:一个函数最多可以具有一个可变参数。

16)InOut参数:

函数参数默认为常量。 试图从函数主体内部更改函数参数的值会导致编译时错误。 这意味着您不能错误地更改参数的值。 如果您希望函数修改参数的值,并且希望这些更改在函数调用结束后仍然存在,请将该参数定义为输入输出参数

17)封闭:

闭包是可以独立传递的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambda。

18)尾随关闭:

如果您需要将闭包表达式作为函数的最终参数传递给函数并且闭包表达式很长,那么将其写为尾随闭包可能会很有用。

19)捕获值:

闭包可以从定义它的周围上下文中捕获常量和变量。

20)逃逸关闭:

当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义 ,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许对闭包进行转义。

Swift的闭包是引用类型,这意味着如果您将两个变量指向同一个闭包,它们将共享该闭包-Swift只是记住,通过增加其引用计数,有两件事依赖于它。

当闭包传递给要使用的函数时,Swift需要知道该函数是否将立即被使用,或者是否将其保存以供以后使用。 如果立即使用它,编译器可以跳过将一个添加到其引用计数中的操作,因为闭包将立即运行然后被遗忘。 但是,如果以后使用它-甚至可能以后使用它-Swift需要在其引用计数中添加一个,以便不会意外销毁它。

21)自动关闭

自动闭包是一种自动创建的闭包,用于包装将作为参数传递给函数的表达式。 它不带任何参数,并且在调用它时,它返回包装在其中的表达式的值。 这种语法上的便利性使您可以通过编写正则表达式而不是显式闭包来省略函数参数的花括号。

22)什么是枚举:

枚举为一组相关值定义一个通用类型,并使您能够在代码中以类型安全的方式使用这些值。

23)递归枚举:

递归枚举是一种枚举,该枚举具有该枚举的另一个实例作为一个或多个枚举案例的关联值。 您可以通过在其前面写一个间接值来指示枚举用例是递归的,这告诉编译器插入必要的间接层。

24)结构和类别差异:

类是引用类型,结构是值类型

结构在您的代码中传递时总是被复制,并且不使用引用计数。

所有结构和枚举都是Swift中的值类型。 这意味着,您创建的任何结构和枚举实例以及它们具有的任何值类型作为属性,都将在它们在代码中传递时始终被复制。

与值类型不同,将引用类型分配给变量或常量或将其传递给函数时, 不会复制引用类型 。 而不是副本,而是使用对相同现有实例的引用。

25)存储的属性:

最简单的形式是,存储的属性是作为特定类或结构的实例的一部分存储的常量或变量。

26)延迟存储的属性:

惰性存储的属性是直到首次使用才计算其初始值的属性。 您可以通过在声明之前编写lazy修饰符来表示一个惰性存储属性。

27)计算属性:

除了存储的属性外,类,结构和枚举还可以定义计算的属性 ,而实际上并不存储值。 相反,它们提供了一个getter和一个可选的setter,以间接检索和设置其他属性和值。

28)只读计算属性:

具有getter但不包含setter的计算属性称为只读计算属性 。 只读的计算属性始终返回一个值,并且可以通过点语法进行访问,但不能将其设置为其他值。

29)物业观察员:

财产观察员观察并响应财产价值的变化。 每次设置属性值时都会调用属性观察器,即使新值与属性的当前值相同也是如此。

·将在存储值之前调用willSet。

·存储新值后立即调用didSet。

30)类型属性:

无论您创建了多少个该类型的实例,这些属性将永远只有一个副本。 这些类型的属性称为类型属性

31) 方法:

实例方法:实例方法是属于特定类实例的方法。

类型方法:您还可以定义在类型本身上调用的方法。 这些方法称为类型方法 。 您可以通过在方法的func关键字之前写入static关键字来指示类型方法。 类也可以使用class关键字允许子类重写该方法的超类实现。

在Objective-C中,您只能为Objective-C类定义类型级别的方法。 在Swift中,您可以为所有类,结构和枚举定义类型级别的方法。 每个类型方法都明确地限定于它支持的类型。

32)下 标:

类,结构和枚举可以定义下标 ,这些下标是访问集合,列表或序列的成员元素的快捷方式。 例如,您可以将Array实例中的元素作为someArray [index]访问,并将Dictionary实例中的元素作为someDictionary [key]访问。

33) 防止超越:

您可以通过将方法,属性或下标标记为final来防止其被覆盖。 为此,可以在方法,属性或下标的Introductionr关键字(例如final var,final func,final class func和final下标)之前编写final修饰符。

34) ARC(自动参考计数:)

当不再需要类实例使用的实例时,ARC会自动释放它们。

35) 扩展名:

扩展为现有的类,结构,枚举或协议类型添加了新功能。 这包括扩展您无法访问原始源代码的类型的能力(称为追溯建模 )。 扩展与Objective-C中的类别相似。 (与Objective-C类别不同,Swift扩展没有名称。)

36) 协议:

协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。

然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。

37) 泛型:

通用代码使您可以编写灵活,可重用的函数和类型,这些函数和类型可以根据您定义的要求与任何类型一起使用。 您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。

38) 访问控制:

我们具有openpublicinternalfileprivateprivate进行访问控制。开放式访问是最高(最低限制)访问级别,私有访问是最低(最严格)访问级别。

开放和公共:开放访问和公共访问使实体可以在其定义模块的任何源文件中使用,也可以在导入定义模块的另一个模块的源文件中使用。

o公共类和类成员只能在定义模块(目标)内进行子类化和重写。

o开放类和类成员可以在定义模块(目标)之内和之外被子类化和覆盖。

  • 内部访问使实体可以在其定义模块的任何源文件中使用,但不能在该模块外部的任何源文件中使用。 在定义应用程序或框架的内部结构时,通常使用内部访问。

FilePrivate:使用文件专用访问级别定义的功能只能从定义该文件的swift文件中访问。

私有:通常,仅当在单个声明中使用特定功能的实现细节时,才使用私有访问权限来隐藏这些细节。