1. 给一个数组,要求写一个函数,交换数组中的两个元素

  • 二X程序员:

好简单啊,直接写出以下结果

 func swap(_ nums: inout [Int], _ p: Int, _ q: Int) {     let temp = nums[p]     nums[p] = nums[q]     nums[q] = temp  } 复制代码

  • 普通程序员:

首先跟面试官沟通,是什么类型的数组?面试官会说,任意。普通程序员微微一笑,写出以下代码

 func swap<T>(_ nums: inout [T], _ p: Int, _ q: Int) {     let temp = nums[p]     nums[p] = nums[q]     nums[q] = temp  } 复制代码

  • 文艺程序员:

与面试官沟通,是什么类型的数组?有什么其他要求和限制?面试官会说,这是一个Swift面试题。文艺程序员心领神会,于是写出以下答案:

 func swap<T>(_ nums: inout [T], _ p: Int, _ q: Int) {     (nums[p], nums[q]) = (nums[q], nums[p]) } 复制代码

同时对以上代码写上相应测试,检测各种边界情况,再确认无误后,才会说,这道题目我完成了。 这道题目看似简单,实际上考察了程序员的审题、交流、以及测试的意识。技术上考察了Swift的泛型和Tuple的性质。
2. 下面代码有什么问题

 public class Node {   public var value: Int   public var prev: Node?   public var post: Node?    public init(_ value: Int) {     self.value = value   } } 复制代码

答案:应该在 var prev 或者 var post 前面加上 weak。 原因:表面上看,以上代码毫无问题。但是我这样一写,问题就来了:

 let head = Node(0) let tail = Node(1) head.post = tail tail.prev = head 复制代码

此时,headtail 互相指向,形成循环引用(retain cycle)

3. 实现一个函数,输入是任一整数,输出要返回输入的整数 + 2
这道题很多人上来就这样写:

 func addTwo(_ num: Int) -> Int {     return num + 2 } 复制代码

接下来面试官会说,那假如我要实现 + 4 呢?程序员想了一想,又定义了另一个方法:

 func addFour(_ num: Int) -> Int {     return num + 4 } 复制代码

这时面试官会问,假如我要实现返回 + 6, + 8 的操作呢?能不能只定义一次方法呢?正确的写法是利用 Swift 的柯西特性:

 func add(_ num: Int) -> (Int) -> Int {   return { val in     return num + val   } }  let addTwo = add(2), addFour = add(4), addSix = add(6), addEight = add(8) 复制代码

4. 精简以下代码

 func divide(dividend: Double?, by divisor: Double?) -> Double? {    if dividend == nil {      return nil    }     if divisor == nil {      return nil    }    if divisor == 0 {      return nil   }     return dividend! / divisor! } 复制代码

这题考察的是guard let语句以及 optional chaining,最佳答案是:

 func divide(dividend: Double?, by divisor: Double?) -> Double? {      guard let dividend = dividend, let divisor = divisor, divisor != 0 else {         return nil     }      return dividend / divisor } 复制代码

5. 以下函数会打印出什么?

 var car = "Benz"  let closure = { [car] in    print("I drive (car)") }  car = "Tesla"  closure() 复制代码

因为 clousre 已经申明将 car 复制进去了([car]),此时clousre 里的 car 是个局部变量,不再与外面的 car有关,所以会打印出”I drive Benz”。 此时面试官微微一笑,将题目略作修改如下:

 var car = "Benz"  let closure = {   print("I drive (car)") }  car = "Tesla"  closure() 复制代码

此时 closure 没有申明复制拷贝 car,所以clousre 用的还是全局的 car 变量,此时将会打印出 “I drive Tesla”

6. 以下代码会打印出什么?

 protocol Pizzeria {    func makePizza(_ ingredients: [String])   func makeMargherita() }   extension Pizzeria {    func makeMargherita() {      return makePizza(["tomato", "mozzarella"])    } }  struct Lombardis: Pizzeria {    func makePizza(_ ingredients: [String]) {      print(ingredients)   }    func makeMargherita() {     return makePizza(["tomato", "basil", "mozzarella"])    } }  let lombardis1: Pizzeria = Lombardis() let lombardis2: Lombardis = Lombardis()  lombardis1.makeMargherita() lombardis2.makeMargherita() 复制代码

答案:打印出如下两行[“tomato”, “basil”, “mozzarella”][“tomato”, “basil”, “mozzarella”]
Lombardis的代码中,重写了makeMargherita的代码,所以永远调用的是Lombardis 中的 makeMargherita。 再进一步,我们把 protocol Pizzeria 中的 func makeMargherita() 删掉,代码变为:

 protocol Pizzeria {   func makePizza(_ ingredients: [String]) }  extension Pizzeria {   func makeMargherita() {     return makePizza(["tomato", "mozzarella"])   } }  struct Lombardis: Pizzeria {   func makePizza(_ ingredients: [String]) {     print(ingredients)   }   func makeMargherita() {     return makePizza(["tomato", "basil", "mozzarella"])   } }  let lombardis1: Pizzeria = Lombardis() let lombardis2: Lombardis = Lombardis() lombardis1.makeMargherita() lombardis2.makeMargherita() 复制代码

这时候打印出如下结果:[“tomato”, “mozzarella”][“tomato”, “basil”, “mozzarella”]
因为lombardis1Pizzeria,而 makeMargherita() 有默认实现,这时候我们调用默认实现。

作为一个iOS开发者,有一个很好的学习环境,是必不可少的,iOS开发交流技术群:[563513413](正在跳转),不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
7. Swift 中定义常量和 Objective-C 中定义常量有什么区别?

一般人会觉得没有差别,因为写出来好像也确实没差别。 OC是这样定义常量的:

 const int number = 0; 复制代码

Swift 是这样定义常量的:

 let number = 0 复制代码

首先第一个区别,OC中用 const 来表示常量,而 Swift 中用 let 来判断是不是常量。
上面的区别更进一步说,OC中 const 表明的常量类型和数值是在 compilation time 时确定的;而 Swift 中 let 只是表明常量(只能赋值一次),其类型和值既可以是静态的,也可以是一个动态的计算方法,它们在 runtime 时确定的。

8. Swift 中 struct 和 class 什么区别?举个应用中的实例

struct 是值类型,class 是引用类型。

看过WWDC的人都知道,struct 是苹果推荐的,原因在于它在小数据模型传递和拷贝时比 class 要更安全,在多线程和网络请求时尤其好用。我们来看一个简单的例子:

 class A {   var val = 1 }  var a = A() var b = a b.val = 2 复制代码

此时 a 的 val 也被改成了 2,因为 a 和 b 都是引用类型,本质上它们指向同一内存。解决这个问题的方法就是使用 struct

 struct A {   var val = 1 }  var a = A() var b = a b.val = 2 复制代码

此时 A 是struct,值类型,b 和 a 是不同的东西,改变 b 对于 a 没有影响。

9. Swift 到底是面向对象还是函数式的编程语言?

Swift 既是面向对象的,又是函数式的编程语言。 说 Swift 是 Object-oriented,是因为 Swift 支持类的封装、继承、和多态,从这点上来看与 Java 这类纯面向对象的语言几乎毫无差别。 说 Swift 是函数式编程语言,是因为 Swift 支持 map, reduce, filter, flatmap 这类去除中间状态、数学函数式的方法,更加强调运算结果而不是中间过程。

ios项目 swift 定义常量 其他文件引用_面试应该注意的Swift知识点相关推荐

  1. 【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )

    文章目录 类的定义 ( 头文件引用次数控制 ) 类的实现 ( 构造函数 | 析构函数 ) CMake 编译配置 类测试 ( 构造析构调用测试 ) 类的定义 ( 头文件引用次数控制 ) 类定义 , 类一 ...

  2. file input 移动端选择文件夹_免费 |《MNN For Swift》移动端机器学习实战课程

    自 2019 年 4 月在 Github 开源以来,淘系技术部-端智能团队自研的 MNN 推理引擎,因为其高性能.易用性以及优秀兼容性受到不少开发者的支持和喜爱.我们也把这份支持化作不断前进的动力,仅 ...

  3. java接口中只能定义常量和抽象方法_接口中只能定义常量和抽象方法。( )_学小易找答案...

    [判断题]在可见光吸光光度法中,为保证吸光度测量的灵敏度,入射光始终选择 λ max. [判断题]接口中只能定义常量和抽象方法.( ) [单选题]类与对象的关系是 ( ) [单选题]某物质的摩尔吸光系 ...

  4. AngularJS获取项目中定义的json文件

    项目结构: 文件夹js位于根路径下 1 $http.get('js/app/contact/contacts.json').then(function (res) { 2 /*下面就是获取到的数据*/ ...

  5. iOS - 常用宏定义和PCH文件知识点整理

    (一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...

  6. c++宏定义常量为什么使用移位_干货 | C语言系列3——常量,运算符,常用数学函数.........

    本期总结 1.符号常量和const常量: 2.运算符: 3.输入与输出: 4.常用数学函数. 往期回顾 干货 | C语言系列1--编程软件与做题平台 干货 | C语言系列2--程序结构与变量 符号常量 ...

  7. define定义的函数如何引用_「C与指针心得」25.预处理器-宏函数

    感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章 上一节讲了一些系统的预定义宏,这一节来讲一讲 宏定义.宏函数. 预处理常量 define: 预处理器指令从#开始,到最后第一个换行符为 ...

  8. java m4a文件拼接_面试官:为啥不提倡字符串拼接?看阿里java开发手册怎么说

    阿里规约 先来看阿里java开发手册的第22条,循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展. 说明:下例中,反编译出的字节码文件显示每次循环都会 ne ...

  9. js打开服务器pdf文件,iOS使用pdf.js打开PDF文件

    最近研究了下iOS打开PDF文件的方式,由于项目需要在浏览PDF文件时能使用HTML格式文件,调研了一下iOS中打开PDF文件的几种方式,发现pdf.js开源库可以做到这一点,通过调用js在线预览PD ...

最新文章

  1. react-native 常用命令
  2. 您必须有下列压缩分卷才能继续解压
  3. redis连接与redis的python连接
  4. codeforces 486A-C语言解题报告
  5. Launchpad图标大小怎么调整?
  6. qt调用外部程序(exe)
  7. HTML前端数据管理,前端数据管理
  8. 【转载】python做图像的傅里叶变换——二维傅里叶变换
  9. Mac制作windows10安装U盘
  10. Roguelike随机地下城 | 二、设置门和优化最终房间的选择
  11. data[i] is underfined
  12. 1142 Maximal Clique
  13. 安防市场视频监控比重大 并有新商机
  14. Linux学习之路_8.搜索查找类
  15. 爬虫实现中英文的词语和句子互译
  16. Linux的进程优先级-邹立巍
  17. TensorFlow Mobilenet SSD模型压缩并移植安卓上以达到实时检测效果
  18. 组播地址MAC的计算
  19. 绿幕虚拟直播,直播时代的风口
  20. 阿里云ubuntu用vi创建并运行.c文件

热门文章

  1. 24K 内存上诞生的操作系统,是如何改变计算机世界的?
  2. 米聊关停;抖音支付正式上线;谷歌禁用第三方 Chromium 同步功能 | 极客头条
  3. 开发者点评GitHub 暗黑模式:太暗了
  4. 知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍!
  5. 苹果回应:iPhone 11用北斗导航作为位置数据系统一部分;马云回应年轻人去做快递小哥;Linux Lab发布v0.5 rc3| 极客头条
  6. MyBatis 缓存原来是这么一回事儿!| 原力计划
  7. 研发的未来在哪里?Serverless 云开发来了!
  8. 《原力计划【第二季】》第 8 周周榜揭晓!!!
  9. 情人节脱单秘诀,程序员表白的情话大盘点!| CSDN 博文精选
  10. 全民编程时代,程序员该如何保住饭碗?