Swift 面试题

初级

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 = nil 来定义。

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

你可能感兴趣的:(Swift 面试题)