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<Int> = 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 1、Swift 比 Objective-C 有什么优势? Swift 速度更快,运算性能更高。Swift 语法简单...
    凌云01阅读 3,693评论 0 11
  • 为啥数组越界抛出异常而字典不会?答案:因为下标访问的实现不一样,struct Array<Element> {su...
    Mannyao阅读 3,304评论 3 3
  • class 和 struct 的区别 class 为类, struct 为结构体, 类是引用类型, 结构体为值类型...
    Master_K阅读 1,015评论 0 3
  • 一.Swift和OC的区别? 1.swift是静态语言,有类型推断,OC是动态语言。 2.swift面向协议编程,...
    傲骨天成科技阅读 5,703评论 5 49
  • 这是卓同学的 Swift 面试题 强行来答一波,如有歧义、错误、不全,欢迎指(来)正(喷)。面试题基础篇有36题,...
    DamonLu阅读 9,392评论 3 76