这份面试题是上海某互联网公司 iOS 的面试题,同时欢迎把各位发 swift 的面试题给我
1.swift中,如何阻止一个方法属性,属性,下标被子类改写?
在类的定义中使用final关键字声明类、属性、方法和下标。final声明的类不能被继承,final声明的属性、方法和下标不能被重写。
2.swift中,实现一个将整形数组全部转化成对应的字符串数组(eg: [1,2,3,4,5] -> ["1","2","3","4","5"])
var sampleArray: [Int] = [1,2,3,4,5]
sampleArray.map {
String($0)
}
//["1", "2", "3", "4", "5"]
3.swift中,关键字 guard 和 defer 的用法
guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。
guard let name = self.text else { return }
defer的用法是,这条语句并不会马上执行,而是被推入栈中,直到函数结束时才再次被调用。
defer {
//函数结束才调用
}
4.使用 swift 中的泛型来编写一段交换两个值的函数
func swapValue<T,U>(inout x: T, inout y: U) -> (x: U, y: T) {
return (y, x)
}
var tuple = ("ab", 1)
swapValue(&tuple.0, y: &tuple.1)
//(1, "ab")
//这块我自己对泛型了解不深,会继续更新
---Swift 3更新:
func swapValue<T,U>(x: T, y: U) -> (x: U, y: T) {
return (y, x)
}
5.在 swift 中,对一个 optional 变量拆包有多少种办法?
如果确定一个 optional 包含值,可以用 ! 来访问,就是强制拆包.
尝试使用!来访问不存在值的optional value 会触发运行时错误。当!来强制拆包(force-unwrap)的时候,
一定要确保这个optional value一定包含一个非nil 值。
隐式拆包: 通过在声明时的数据类型后面加(!)来实现
var str: String! = "Hello World!"
//Hello World!
更新, 感谢分享题目
6. swift中怎么调OC代码
在swift项目中创建一个OC文件的时候,Xcode 会提示创建一个桥接文件 点确定创建桥接文件,Xcode会自动创建一个桥接文件
工程名-Bridging-Header.h
把swift需要用到的OC文件的头文件放到桥接文件里 工程名-Bridging-Header.h
7. open关键字和public关键字区别
鉴于当前写时候是 Swift3.x, 现在共有5种权限控制关键字,之后 Swift4 又会有变化.
- open
open 修饰的 class 在 Module 内部和外部都可以被访问和继承
open 修饰的 func 在 Module 内部和外部都可以被访问和重载(override) - Public
public 修饰的 class 在 Module 内部可以访问和继承,在外部只能访问
public 修饰的 func 在 Module 内部可以被访问和重载(override),在外部只能访问