初级
1、swift和OC的区别?
1)swift是静态语言,有类型推断,OC是动态语言。
2)swift是一门支持多编程范式的语言,既支持面向对象编程,也支持面向协议编程,同时还支持函数式编程,OC面向对象编程。
3)swift注重值类型,OC注重引用类型。
4)swift支持泛型,OC只支持轻量泛型
5)swift支持静态派发(效率高)、动态派发(函数表派发、消息派发)方式,OC支持动态派发(消息派发)方式。
6)swift的协议不仅可以被类实现,也可以被struct和enum实现
7)swift有元组类型、支持运算符重载
8)swift支持命名空间
9)swift支持默认参数
func makeCoffee(coffeeName:String = "雀巢") -> String {
return "制作了一杯\(coffeeName)咖啡"
}
makeCoffee()
10)swift比oc代码更加简洁
总结:swift比Objective-C优势:
1)swift容易阅读,语法和文件结构简易化。
2)swift更易于维护,文件分离后结构更清晰。
3)swift更加安全,它是类型安全的语言:
4)swift代码更少,简洁的语法,可以省去大量冗余代码。
5)swift速度更快,运算性能更高。
2、Struct和Class区别?(OC 中的内联函数)
3、Swift中的常量和OC中的常量有啥区别?
OC中的常量(const)是编译期决定的,Swift中的常量(let)是运行时确定的
4、String 与 NSString 的关系与区别?
1)本质区别:String是结构体,NSString是类,结构体是值类型,值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。
2)String独有API
初始化String变量:var string=String() string="123"
isEmpty属性:string.isEmpty//bool
字符串比较:直接使用==和!=号就可以搞定
sorted()方法(字符串排序并返回[Character]):"31-ab2".sorted() //["-","1","2","3","a","b"]
filter方法(过滤字符):"12 4d sf".filter{$0!=" "}//124dsf
dropFirst(_ k: Int = 1)方法(删除开头k个元素):"124dsf".dropFirst(2)// 4dsf
reversed()方法(颠倒字符串):String("124dsf".reversed())//fsd421
3)NSString独有API
integerValue属性 (转成Int类型,不能转成Int则返回0)
boolValue属性 (第一个字符为Y、y、T、t、数字则返回true,否则返回false)
isEqual方法等
4)相互转化:
let someString="123"
let someNSString=NSString(string:"n123")
let strintToNSString=someString as NSString
let nsstringToString=someNSString as String
5、怎么获取一个 String 的长度?
let text :String="1345"
print(text.count)//4
6、如何截取 String 的某段字符串?
截取‘:’前面所有的字符串
let str="https://jianshu.com"
let range:Range=str.range(of:":")!
let location:Int=str.distance(from:str.startIndex,to:range.lowerBound)
let subStr=str.prefix(location)
print(subStr)//打印结果:https
截取‘:’前面所有的字符串(结果包含‘:’)
let str="https://jianshu.com"
let range:Range=str.range(of:":")!
let location:Int=str.distance(from:str.startIndex,to:range.upperBound)
let subStr=str.prefix(location)print(subStr)//打印结果:https:
截取':'后面的所有字符串
let str="https://jianshu.com"letrange:Range=str.range(of:":")!
let location:Int=str.distance(from:str.startIndex,to:range.upperBound)
let subStr=str.suffix(str.count-location)//print(subStr)打印结果://jianshu.com
截取':'后面的所有字符串(结果包含‘:’)
let str="https://jianshu.com"
let range:Range=str.range(of:":")! let location:Int=str.distance(from:str.startIndex,to:range.lowerBound)
let subStr=str.suffix(str.count-location)print(subStr)//打印结果:://jianshu.com
7、指定构造器和便利构造器有什么区别?
类必须要有一个指定构造器,可以没有便利构造器
便利构造器必须调用本类另一个构造器,最终调用到本类的指定构造器
便利构造器前面需要添加convenience关键字
8、Swift中的访问控制权限?
Open:实体可被同一模块内所有实体访问,模块外可导入该模块即可访问,模块外可被继承和重写。
Public:实体可被同一模块内所有实体访问,模块外可导入该模块即可访问,模块外不能被继承和重写。
Internal:实体可被同一模块内所有实体访问,模块外无法访问,大部分实体默认是Internal级别。
fileprivate:限制实体只能在当前文件内访问到,不管是否在本类的作用域。
private: 限制实体只能在本类的作用域且在当前文件内能访问。
关于嵌套类型:嵌套类型的访问级别和包含它的类型访问级别一致。但是public除外,在public修饰的类中定义嵌套类型默认为internal访问级别。
9、什么时候使用 final?
1)final关键字可以在class、func和var前修饰,表示不能被继承或重写,否则编译器会报错, 可以将类或者类中的部分实现保护起来,从而避免子类破坏。
2)它可以显示的指派函数的派发机制。
10、声明一个只有一个参数没有返回值闭包的别名?
typealias myBlock = (_ num1: Int, _ num2: Int) -> ()
11、Set(集合类型)的使用场景?
Set存储值类型相同、无序、去重
12、?,??的区别
1)?用来声明可选值,如果变量未初始化则自动初始化nil;在操作可选值时,如果可选值是nil则不响应后续的操作;使用as?进行向下转型操作;
2)?? 用来判断左侧可选值非空(not nil)时返回左侧值可选值,左侧可选值为空(nil)则返回右侧的值。
13、Any和AnyObject的区别?
AnyObject只能表示引用类型的任何实例,相当于Objective-C中的id类型。
Any可以表示类,结构体,枚举的任何实例。
AnyObject是Any的子集。
14、Swift的Copy On Write机制了解过吗?
1)Swift中参数传递是值类型传递,它会对值类型进行copy操作,当传递一个值类型变量时(变量赋值,函数传参),它传递的是一份新的copy值,两个变量指向不同的内存区域。如果频繁操作的变量占内存较大,会产生性能问题。
2)Copy On Write是一种优化值类型copy的机制,对String、Int、Float等非集合数据类型,赋值直接拷贝,对于Array等集合类型数据,只有传递的内容值改变后才进行拷贝操作。
3)Copy On Write的实现:set函数中判断是否存在多个引用,只有存在多个引用的情况下才会进行拷贝操作。另外,自定义结构体是不支持Copy On Write的。
15、In-Out(inout关键字)参数了解过吗?
默认情况下,函数参数默认是常量,试图从函数体中去改变一个函数的参数值会报编译错误。如果希望函数修改参数值,并在函数调用结束后仍然保留。这个时候就需要用到inout关键字。
inout关键字修饰的变量传递过程:
1)函数被调用,参数值会被拷贝
2)在函数体中,修改的是拷贝的值
3)函数返回时,拷贝的值会赋值给原参数
注意事项:
inout关键字只能修饰变量,无法修饰常量,因为常量和字面量不能被修改。
inout参数不能有默认值,可变参数不能标记为inout。
调用函数的时候,应该在变量名前放置&符号表示该变量可以由函数修改。
var variable: Int = 1
func changeNumber(num:inout Int) {
num = 2
print(num)
}
changeNumber(num: &variable) // 2
16、什么是自动闭包、逃逸闭包?
@autoclosure:自动闭包(默认非逃逸闭包),它是一种自动创建的闭包,用来包装作为参数传递给函数的表达式,不接受任何参数,被调用时返回被包装的表达式的值。自动闭包可以延迟计算,因为只有调用到这个闭包代码才会执行,这样我们便可以控制代码什么时候执行。
17、存储属性和计算属性的区别?
18、try? try! t r y 是什么意思?
19、throws 和 rethrows 的用法与作用?
20、weak与unowned的区别?
21、typealias和associatedtype的区别?
22、高阶函数map、flatMap、CompactMap 、filter 、reduce的区别?
23、swift关键字详解?
24、可选值(Optional)是什么东西?
Optional是一个包含None和Some(Wrapped)两种类型的泛枚举类型,Optional.None即nil,Optional.Some非nil。
除了使用 let someValue: Int? = nil 之外, 还可以使用let optional1: Optional
25、Swift中的构造器
Swift 为类类型提供了两种构造器:指定构造器和便利构造器
指定构造器是类中最主要的构造器;便利构造器是类中比较次要的、辅助型的构造器,
类的指定构造器语法如下:
init(parameters) { statements}
类的便利构造器语法如下:
convenienceinit(parameters) {
statements
}
构造器和便利构造器之间的调用关系:(1)指定构造器必须调用其直接父类的的指定构造器。(2)便利构造器必须调用同类中定义的其它构造器(3)便利构造器必须最终导致一个指定构造器被调用。
26、swift的派发机制(函数的派发机制:静态派发(直接派发)、函数表派发、消息派发)?
1)swift中所有值类型:struct、enum使用直接派发。
2)swift中协议的extensions(类似于OC的分类)使用直接派发,初始声明函数使用函数表派发
3)swift中class中extensions使用直接派发,初始化声明函数使用函数表派发,dynamic修饰的函数使用消息派发。
4)swift中NSObject的子类用@nonobjc或final修饰的函数使用直接派发,初始声明函数使用函数表派发,dynamic修饰的extensions使用消息派发
27、swift显示指定派发方式?
1)添加final关键字的函数使用直接派发
2)添加static关键字函数使用直接派发
3)添加dynamic关键字函数使用消息派发
4)添加@objc关键字的函数使用消息派发
5)添加@inline关键字的函数告诉编译器可以使用直接派发
28、什么是柯里化?
柯里化:把接受多个参数的函数变成接受一个单一参数(最初函数的第一个)的函数,并且返回接受余下的参数和返回结果的新函数。
func multiplyTwoNumbers(_one:Int) -> (Int) -> Int {
return{$0* one}
}
//调用
let a = multiplyTwoNumbers(2)
let b = a(3)
print(b)//输出6
原文引用:
《卓同学的 Swift 面试题》上
《卓同学的 Swift 面试题》下
https://www.jianshu.com/p/ea1a376db2ad
https://blog.csdn.net/jiisd/article/details/47844657
https://www.jianshu.com/p/a60f035bf676
https://www.jianshu.com/p/00e89101622a
https://www.jianshu.com/p/82a4bb73ddcf
https://www.jianshu.com/p/fc6131a58aea
https://www.jianshu.com/p/986ae3d8bee4
https://www.cnblogs.com/Erma-king/p/6755969.html
https://www.jianshu.com/p/7fada3cc8975
https://blog.csdn.net/jacob_ios/article/details/80594110
https://blog.csdn.net/u012581760/article/details/106166542
http://events.jianshu.io/p/30654a169242
https://www.cnblogs.com/liYongJun0526/p/7522130.html
https://zhuanlan.zhihu.com/p/462800711