iOS面试问题(快速)-第2部分

1.在Swift中解释泛型?

利用GENICS,您可以编写可与任何类型一起使用的灵活,可重用的函数和类型 。 您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。

Swift的Array和Dictionary类型都是通用集合。

在下面的代码中,用于交换两个值的泛型函数用于字符串和整数。 这是可重用代码的示例。

func swapTwoValues (_ a:inout T,_ b:inout T){
让临时A = a
a = b
b =临时A
}
var num1 = 4
var num2 = 5
var str1 =“ a”
var str2 =“ b”
swapTwoValues(&num1,&num2)
swapTwoValues(&str1,&str2)
print(“ num1:”,num1) //输出:5
print(“ num2:”,num2) //输出:4
print(“ str1:”,str1) //输出:b
print(“ str2:”,str2) //输出:a

2. swift中的可选内容是什么?何时使用可选内容?

Swift中的可选类型是可以保存值或不保存值的类型。 可选的是通过在任何类型后附加“ ?”来编写的。

可选用例

1.可能会失败的事情(本来是期待,但一无所获)

2.事情现在不算什么,但以后可能会发生(反之亦然)

可选的好例子

可以存在或不存在的属性 ,例如Person类中的middleName或配偶。

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

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

委托属性 ,不一定总是需要设置,并且通常在初始化之后设置。

对于班级弱者 。 他们指向的东西可以随时设置为nil。

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

3.什么是快速可选链?

在可选的可能为“ nil”的查询中调用,调用属性,下标和方法过程被定义为可选链接。 可选链接返回两个值-

  • 如果可选包含“值”,则调用其相关属性,方法和下标将返回值
  • 如果可选参数的所有相关属性都包含“ nil”值 ,则方法和下标将返回nil

可选链接是强制展开的替代方法。

4.什么是强制展开?

强制展开:这是提取 Optional中包含的值的方法。 此操作很危险,因为您正在告诉编译器: 我确定此Optional值确实包含真实值,请解压缩它!

让价值:诠释? = 1

让newValue:Int =值! //现在newValue包含1

让anotherOptionalInt:Int? =无

让anotherInt = anotherOptionalInt! // 输出:致命错误:展开一个可选值时意外发现nil。

5.什么是隐式展开?

I mplicit Unwrapping:当我们定义一个Implicitly unwrapped可选对象时,我们定义了一个容器,该容器将在每次读取它时自动执行强制解包。

var名称:字符串! =“维拉特”

让学生=名称//如果现在我们阅读文本

名称=零

let player = name // 致命错误:展开一个可选值时意外发现nil

如果一个隐式解包的可选值为nil并且您尝试访问其包装值,则会触发运行时错误。 结果与将感叹号放在不包含值的普通可选内容之后完全相同。

6.什么是可选绑定?

您可以“安全”和“不安全”两种方式打开可选包装。 安全的方法是使用可选绑定。

可选绑定,用于查找可选值是否包含值,如果包含,则将该值用作临时常量或变量。 无需使用 后缀以访问其值。

 let possibleString: String? = "Hello" 
if let actualString = possibleString {
// actualString is a normal (non-optional) String value
// equal to the value stored in possibleString
print(actualString)
}
else {
// possibleString did not hold a value, handle that
// situation
}

7.什么是警卫声明及其好处?

Guard语句简单而强大。 它检查某种条件,如果它的计算结果为假,则执行else语句,该语句通常将退出方法。

  func addStudent(student:[String:String]){ 
警卫让姓名=学生[“姓名”]否则{
返回
}
print(“添加了\(名称)!”)
守卫let rollNo =学生[“ rollNo”]其他{
打印(“未分配卷号”)
返回
}
print(“分配的卷号为\(rollNo)。”)
}
  addStudent(student:[“ name”:“ Ravi”]) 
//打印“已添加Ravi!”
//打印“未分配卷号”
  addStudent(student:[“ name”:“ Ravi”,“ rollNo”:“ 1”]) 
//打印“已添加Ravi!”
//打印“分配的卷号为1”

保护声明的好处是执行速度更快 。 保护块仅在条件为false时运行,并且它将通过控制传递语句(如returnbreakcontinuethrown退出代码块。 它提供了提前退出减少括号的可能性 。 提早退出意味着更快的执行速度。

请参阅本文以获取有关可选的更多信息。

8. 什么时候使用警卫租赁,如果使用?

  • 当我们想要消除意外/错误的输入并专注于目标时使用警惕,并在我们有其他方法处理输入时使用。
  • 如果else块相对较短,请使用防护以减少嵌套和缩进。

9.什么是延期?

在代码执行离开当前代码块之前推迟执行一组语句的语句。

if代码块中的defer语句将首先执行。 然后,它遵循LIFO模式来执行其余的defer语句。

  func doSomething(){ 
 推迟{print(“ 1”)} 
 推迟{打印(“ 2”)} 
 推迟{print(“ 3”)} 
 如果1 <2 { 
 推迟{print(“ 1 <2”)} 
  } 
 推迟{打印(“ 4”)} 
 推迟{打印(“ 5”)} 
 推迟{打印(“ 6”)} 
  } 
  输出1 <2 6 5 4 3 2 1 

10.列出Swift中使用的控制转移语句是什么?

  • break — break语句立即结束整个控制流语句的执行
  • 继续 —继续语句使循环停止正在执行的操作,并在循环的下一次迭代开始时重新开始。
  • return —从函数返回值。
  • throw-用于使用Throwing函数传播错误
  • fallthrough — fallthrough语句在切换用例中用于执行根据我们的要求与匹配的case语句相邻的case语句。

快速,fallthrough语句用于执行下一个switch case语句事件(如果不匹配)。

 让integerToDescribe = 5 
var description =“数字\(integerToDescribe)是”
切换integerToDescribe {
情况2、3、5、7、11、13、17、19:
description + =“素数,也”
失败
情况10:
描述+ =“案例10”。
默认:
description + =“一个整数。”
}
print(description)// 输出数字5是质数,也是大小写10。

对于其他部分,请单击链接Part1&Part3 ..关于封闭和关于属性的全部