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

开设iOS开发人员课程的时间越来越少,所以今天我们继续发布10个Swift Questions 10系列的资料。 第一部分可以在这里阅读



在Swift中解释泛型?


泛型(泛型模板)允许您编写可与任何类型一起使用的灵活,可重用的函数和类型。 您可以编写避免重复的代码,并以清晰抽象的方式表达其目的。

Swift中的Array和Dictionary类型是通用集合(泛型)。
在下面的代码中,用于交换两个值的通用函数用于字符串和整数。 这是可重用代码的示例。

func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } var num1 = 4 var num2 = 5 var str1 = “a” var str2 = “b” swapTwoValues(&num1,&num2) swapTwoValues(&str1,&str2) print (“num1:”, num1) //output: 5 print (“num2:”, num2) //output: 4 print (“str1:”, str1) //output: b print (“str2:”, str2) //output: a 

快速的可选类型是什么?何时使用它们?


Swift中的Optional(可选,“可选”)是值可以或可以不可以的类型。 通过添加“?”表示选项 任何类型。

使用可选的选项:

  1. 可能会失败的代码片段(我期望有什么,但什么也没收到)。
  2. 当前为空但以后可能变成某些对象的对象(反之亦然)。

一个可选的好例子:

可能存在或可能不存在的财产 ,例如Person类中的中间名或丈夫/妻子。

一种可以返回值或不返回任何值的方法,例如,在数组中匹配。

可以返回结果或错误且不返回任何内容的方法 ,例如,尝试读取文件的内容(因此通常将返回文件数据),但是该文件不存在。

并非总是必须设置的委托属性 ,通常在初始化之后进行设置。

就像班上薄弱的环节 它们指向的内容可以随时设置为nil。

如果您需要一种方法来找出何时设置了值(数据尚未加载>数据),而不是使用单独的布尔变量dataLoaded。

Swift中的可选链接是什么?


请求,调用可能为“ nil”值的可选属性,下标和方法的过程被定义为可选序列(可选链)

可选序列返回两个值-
  • 如果该选项包含“值”,则在调用与之关联的属性,方法和下标时,将返回该值
  • 如果可选包含“ nil”,则与其关联的所有属性,方法和下标均返回nil

可选序列是强制拆包的替代方法。

什么是强制展开?


强制拆包是一种检索可选内容中包含值的方法。 此操作很危险,因为您实际上是在告诉编译器:我确定此选项包含一个实值,请解压缩它!

 let value: Int? = 1 let newValue: Int = value! //  newValue  1 let anotherOptionalInt: Int? = nil let anotherInt = anotherOptionalInt! // Output:fatal error:  nil    . 

什么是隐式展开?


隐式拆包 :当我们定义一个隐式拆包选项时,我们定义一个容器,该容器将在每次读取它时自动强制拆包。

 var name: String! = “Viratlet student = name //       name = nil let player = name //Output:fatal error:  nil    . 

如果隐式解压缩的可选值为nil,并且您尝试访问其打包值,则将引发运行时错误。 结果与将感叹号放置在不包含值的通常的可选选项之后完全相同。

什么是可选绑定?


您可以以“安全”或“不安全”的方式打开选件的包装。 一种安全的方法是使用可选的活页夹。

可选绑定用于确定可选值是否包含值,如果包含,则我们将使该值作为时间常数或变量可用。 因此,无需使用后缀! 获得其价值。

 let possibleString: String? = "Hello" if let actualString = possibleString { //actualString -  ( )   // ,   possibleString print(actualString) } else { //possibleString   ,   // } 

什么是Guard ?有什么好处?


guard声明简单而强大。 它检查某些条件,如果评估为假,则执行else语句,通常会终止该方法。

 func addStudent(student: [String: String]) { guard let name = student["name"] else { return } print("Added \(name)!") guard let rollNo = student ["rollNo"] else { print("roll No not assigned") return } print("Assigned roll no is \(rollNo).") } addStudent(student: ["name": "Ravi"]) //  "Added Ravi!" //  "roll No not assigned" addStudent(student: ["name": "Ravi", "rollNo": "1"]) //  "Added Ravi!" //  "Assigned roll no is 1" 

guard的优点是执行速度更快 。 仅当条件为false时才执行Guard块,并且该块将通过控制传递语句(如returnbreakcontinuethrown退出。 这样可以提早退出,减少括号。 提早退出意味着更快的执行速度。

请参考本文以获取更多信息。

什么时候应该使用guard letif let什么时候if let

  • 如果您想消除意外/错误的输入,并有其他处理输入的方法,请着重于目标。
  • if使用else块, if使用guard来减少嵌套和缩进,因为它相对紧凑。

什么是defer


在代码执行离开当前块之前,使用defer执行一组语句。

if块中的defer将首先执行。 随后是LIFO模式,以执行其余的defer语句。

 func doSomething() { defer { print(“1”)} defer { print(“2”)} defer { print(“3”)} if 1<2 { defer { print("1<2")} } defer { print(“4”)} defer { print(“5”)} defer { print(“6”)} }  1<2 6 5 4 3 2 1 

列出Swift中使用了哪些控件转移运算符?


break - break语句立即终止整个控制流语句的执行。

continue - continue语句使循环停止正在执行的操作,并在循环的下一次迭代开始时重新开始。
return从函数返回值。
throw -需要使用抛出函数进行错误转发
fallthrough - fallthrough语句在switch case块中用于执行case语句,该case语句根据用户要求位于相应的case语句旁边。

swift fallthrough操作符用于执行下一种情况,即使它与原始情况不匹配也是如此。

 let integerToDescribe = 5 var description = “The number \(integerToDescribe) isswitch integerToDescribe { case 2, 3, 5, 7, 11, 13, 17, 19: description += “ a prime number, and also” fallthrough case 10: description += “ case 10.” default: description += “ an integer.” } print(description)// :The number 5 is a prime number, and also case 10. 

第二部分结束。 第一部分可以在这里阅读

我们正在等待您的评论,并回顾在几个小时内会有一个开放日 ,我们将在此框架内详细讨论我们的课程。

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


All Articles