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时运行,并且它将通过控制传递语句(如return
, break
, continue
或thrown
退出代码块。 它提供了提前退出和减少括号的可能性 。 提早退出意味着更快的执行速度。
请参阅本文以获取有关可选的更多信息。
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。