ios项目 swift 定义常量 其他文件引用_面试应该注意的Swift知识点
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 复制代码
此时,head
和 tail
互相指向,形成循环引用(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”]
因为lombardis1
是 Pizzeria
,而 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知识点相关推荐
- 【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
文章目录 类的定义 ( 头文件引用次数控制 ) 类的实现 ( 构造函数 | 析构函数 ) CMake 编译配置 类测试 ( 构造析构调用测试 ) 类的定义 ( 头文件引用次数控制 ) 类定义 , 类一 ...
- file input 移动端选择文件夹_免费 |《MNN For Swift》移动端机器学习实战课程
自 2019 年 4 月在 Github 开源以来,淘系技术部-端智能团队自研的 MNN 推理引擎,因为其高性能.易用性以及优秀兼容性受到不少开发者的支持和喜爱.我们也把这份支持化作不断前进的动力,仅 ...
- java接口中只能定义常量和抽象方法_接口中只能定义常量和抽象方法。( )_学小易找答案...
[判断题]在可见光吸光光度法中,为保证吸光度测量的灵敏度,入射光始终选择 λ max. [判断题]接口中只能定义常量和抽象方法.( ) [单选题]类与对象的关系是 ( ) [单选题]某物质的摩尔吸光系 ...
- AngularJS获取项目中定义的json文件
项目结构: 文件夹js位于根路径下 1 $http.get('js/app/contact/contacts.json').then(function (res) { 2 /*下面就是获取到的数据*/ ...
- iOS - 常用宏定义和PCH文件知识点整理
(一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...
- c++宏定义常量为什么使用移位_干货 | C语言系列3——常量,运算符,常用数学函数.........
本期总结 1.符号常量和const常量: 2.运算符: 3.输入与输出: 4.常用数学函数. 往期回顾 干货 | C语言系列1--编程软件与做题平台 干货 | C语言系列2--程序结构与变量 符号常量 ...
- define定义的函数如何引用_「C与指针心得」25.预处理器-宏函数
感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章 上一节讲了一些系统的预定义宏,这一节来讲一讲 宏定义.宏函数. 预处理常量 define: 预处理器指令从#开始,到最后第一个换行符为 ...
- java m4a文件拼接_面试官:为啥不提倡字符串拼接?看阿里java开发手册怎么说
阿里规约 先来看阿里java开发手册的第22条,循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展. 说明:下例中,反编译出的字节码文件显示每次循环都会 ne ...
- js打开服务器pdf文件,iOS使用pdf.js打开PDF文件
最近研究了下iOS打开PDF文件的方式,由于项目需要在浏览PDF文件时能使用HTML格式文件,调研了一下iOS中打开PDF文件的几种方式,发现pdf.js开源库可以做到这一点,通过调用js在线预览PD ...
最新文章
- react-native 常用命令
- 您必须有下列压缩分卷才能继续解压
- redis连接与redis的python连接
- codeforces 486A-C语言解题报告
- Launchpad图标大小怎么调整?
- qt调用外部程序(exe)
- HTML前端数据管理,前端数据管理
- 【转载】python做图像的傅里叶变换——二维傅里叶变换
- Mac制作windows10安装U盘
- Roguelike随机地下城 | 二、设置门和优化最终房间的选择
- data[i] is underfined
- 1142 Maximal Clique
- 安防市场视频监控比重大 并有新商机
- Linux学习之路_8.搜索查找类
- 爬虫实现中英文的词语和句子互译
- Linux的进程优先级-邹立巍
- TensorFlow Mobilenet SSD模型压缩并移植安卓上以达到实时检测效果
- 组播地址MAC的计算
- 绿幕虚拟直播,直播时代的风口
- 阿里云ubuntu用vi创建并运行.c文件
热门文章
- 24K 内存上诞生的操作系统,是如何改变计算机世界的?
- 米聊关停;抖音支付正式上线;谷歌禁用第三方 Chromium 同步功能 | 极客头条
- 开发者点评GitHub 暗黑模式:太暗了
- 知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍!
- 苹果回应:iPhone 11用北斗导航作为位置数据系统一部分;马云回应年轻人去做快递小哥;Linux Lab发布v0.5 rc3| 极客头条
- MyBatis 缓存原来是这么一回事儿!| 原力计划
- 研发的未来在哪里?Serverless 云开发来了!
- 《原力计划【第二季】》第 8 周周榜揭晓!!!
- 情人节脱单秘诀,程序员表白的情话大盘点!| CSDN 博文精选
- 全民编程时代,程序员该如何保住饭碗?