- 50道iOS面试问答 - 6
- 1- Why it is better to use higher-order functions? (为什么使用高阶函数更好?)
- 2- Explain Mediator Design Pattern (解释Mediator设计模式)
- 3- What is Result Bundle?
- 4- Explain NSLinguisticTagger
- 5- Explain XCUIDevice
- 6- Explain UIKit Dynamics
- 7- What is the difference between UIKit and SwiftUI ?
- 8- Explain Implicit Expression (解释隐式表达式)
- 9- Explain subscripts
- 10- What is the difference between CustomStringConvertible and CustomDebugStringConvertible?
- 11- What are bundles?
- 12- Explain App Store Connect API
- 13- What are B-Trees?
- 14- Explain tokenization
- 15- Explain Swift asserts
- 16- Explain UICollectionViewFlowLayout
- 17- Explain the difference between a while loop and repeat while
- 18- Explain CustomStringConvertible and its difference from CustomDebugStringConvertible
- 19- Explain Thread Sanitizer
- 20- Explain Bridging Headers in iOS project
- 21- Why would we use multiple projects in the workspace?
- 22- Explain the Open/Closed Principle
- 23- What does agile process do?
- 24- Why is everything in a do-catch block?
- 25- Why is the background mode important?
- 26- Explain the difference between print() and readLine()
- 27- Explain enumerated()
- 28- Explain NSCache
- 29- Explain abs() function
- 30- Explain TextKit
- 31- What is the difference between try? and try! ?
- 32- What is the difference between the cocoa touch class and the normal swift class?
- 33- Explain OptionSet
- 34- Explain the unified logging system
- 35- Explain Address Sanitizer
- 36- Explain the Single Responsibility Principle
- 37- Explain App thinning
- 38- What is the difference between setUp() and tearDown() in XCTestCase ?
- 39- Explain Asset Catalogs
- 40- Explain Dispatch Barriers
- 41- What can breakpoint do?
- 42- Explain Opaque Return Types
- 43- Explain Autoclosures
- 44- Explain UIScene Life Cycle
- 45- Explain Hashable type
- 46- Explain Dynamic Var usage
- 47- Explain UIViewRepresentable requirements
- 48- Explain Dynamic Member Lookup
- 49- Explain Result Type
- 50- Explain Scene Delegate
50道iOS面试问答 - 6
1- Why it is better to use higher-order functions? (为什么使用高阶函数更好?)
以另一个函数作为参数或返回一个函数的函数称为高阶函数。Swift将这些函数定义为CollectionType。
最基本的高阶函数是filter。
2- Explain Mediator Design Pattern (解释Mediator设计模式)
中介对象以隐藏和不受约束的方式封装交互策略。被中介操作的对象并不知道它的存在。它静静地坐在幕后,在他们不允许或不知情的情况下强加自己的政策。
如果您想了解关于此模式的更多信息,我建议您检查中介模式案例研究。
3- What is Result Bundle?
根据苹果的说法,Result Bundle是一个由Xcode生成的包含结构数据的文件,用来描述运行你的测试的构建。它包含构建日志、测试报告、代码覆盖报告和测试附件。
4- Explain NSLinguisticTagger
NSLinguisticTagger是一个用于自然语言处理的API,它允许我们标记文本,检测语言,并确定词性。 NSLinguisticTagger能够识别单词,并告诉我们这是哪种单词。
5- Explain XCUIDevice
XCUIDevice模拟物理按钮和设备方向,用于在iphone和ipad上进行架构测试。
6- Explain UIKit Dynamics
UIKit Dynamics是一个受2D物理启发的动画系统,带有高级API,允许我们在动画和视图交互中模拟物理体验。
7- What is the difference between UIKit and SwiftUI ?
UIKit是一个必要的事件驱动框架,用于构建iOS平台的用户界面。 SwiftUI是一个用于构建用户界面的声明性框架,用于为苹果平台构建用户界面。
8- Explain Implicit Expression (解释隐式表达式)
隐式表达式众所周知是隐式成员表达式,它是访问类型成员的一种方式。
9- Explain subscripts
下标类似于方法。类、结构和枚举可以定义下标,下标是访问集合、列表或序列的成员元素的快捷方式。
10- What is the difference between CustomStringConvertible and CustomDebugStringConvertible?
如果值是一个String,返回该值。如果值为CustomStringConvertible或CustomDebugStringConvertible,则返回String(reflecting:)
11- What are bundles?
bundle是iOS表示可执行代码和存储在驱动器上的其他资源的方式。 最重要的是,bundles负责加载应用使用的本地化字符串。
12- Explain App Store Connect API
App Store Connect API是在2018年全球开发者大会上宣布的。App Store Connect API是标准的RESTful API。API使用JSON Web令牌进行身份验证,可以从所有平台访问。
我们可以自动管理证书、配置文件、管理设备ID和绑定ID、用户、角色、TestFlight和公共链接。
13- What are B-Trees?
b -树是一种搜索树,它提供了具有优良性能特征的有序键值存储。 原则上,每个节点维护自己元素的排序数组和其子元素的另一个数组。
14- Explain tokenization
标记字符串表示使用分隔符分割字符串
15- Explain Swift asserts
如果我们需要检查代码中的某些条件,我们可以使用assert。 断言是一个简洁的调试工具。 断言用于为开发人员检查错误。Standart Swift库中有5个断言函数。
- assert() > 通过assert函数,我可以检查代码的要求条件,即使它工作正确。
- assertionFailure() > 给我们一个关于项目优化的提示。在调试中,模式app会终止,但在发布中,模式app不会终止。行为是未定义的。
- precondition() > 这个函数比assert()更重要。如不符合条件,APP将终止。
- preconditionFailure() > 致命错误.
- fatalError() > 强制我们的应用崩溃。调用此函数后,将不再继续执行。
16- Explain UICollectionViewFlowLayout
UICollectionViewFlowLayout自动尝试放入尽可能多的项目,它可以在一行之前,它包装到下一个。如果我们改变项目大小,我们可以得到多个列。
I highly recommend watching A Tour of UICollectionView
17- Explain the difference between a while loop and repeat while
while循环检查循环代码之前的条件,而repeat while循环检查循环代码之后的条件。如果我们想每次都检查条件是否为真,就必须使用for in循环。
18- Explain CustomStringConvertible and its difference from CustomDebugStringConvertible
我们可以使用实现customstringconvertible协议的对象的自定义字符串描述,并添加名为description的新计算属性
CustomDebugStringConvertible提供了关于对象的附加信息,用于调试目的。
19- Explain Thread Sanitizer
当多个线程试图以非原子方式访问同一内存区域,并且其中一个线程中至少有一个写操作时,启用Thread sanializer允许我们调试数据竞争。
Thread Sanitizer只支持64位的macOS和64位的iOS和tvOS模拟器。不支持watchOS。
20- Explain Bridging Headers in iOS project
桥接header允许我们在Swift文件中包含Objective-C文件。
21- Why would we use multiple projects in the workspace?
模块化的框架和项目构建。我们可以将这些模块添加到我们的工作区中。另一个工作区成员(比如框架)可以使用其他模块。其目标是避免代码重复,并使我们能够使用来自其他工作区模块的代码。
22- Explain the Open/Closed Principle
这个由Bertrand Meyer提出的原则可以简单地解释如下:它意味着开发程序,并在程序中添加新的行为。 根据OCP的程序应该开放开发。组成程序的模块应该能够扩展,但不应修改。 如果我们遵循开/闭原则,我们的类和接口将更具可扩展性。
23- What does agile process do?
敏捷流程只考虑客户指定的需求,转换成用户故事,并按客户的优先级排序。 简而言之,敏捷过程不考虑未来。
24- Why is everything in a do-catch block?
在Swift中,错误在do-catch块中抛出和处理。 这允许我们自定义错误处理,并根据错误执行特定的操作。 有了“do-catch”声明,我们就可以使用了。这允许我们检查有意义的错误。
25- Why is the background mode important?
因为我们可以在后台模式中获取数据,允许我们的应用程序显示最新的信息。
26- Explain the difference between print() and readLine()
我们对标准输出使用print()语句。 它后面跟着一个默认换行结束符。 但有时我们需要读取一行用户输入的标准输入(StdIn)。这意味着,我们可以使用readLine()。 另外,readLine()在调用它时返回一个可选的字符串。
27- Explain enumerated()
根据Apple的说法,如果需要每个元素的索引及其值,可以使用enumerativ()方法遍历数组。
28- Explain NSCache
NSCache是一个NSDictionary,当我们的应用收到内存警告时,它会自动清除自己。NSCache是线程安全的。
29- Explain abs() function
您可以使用abs()函数来计算一个值与另一个值之间的正差。
30- Explain TextKit
根据Apple的说法,TextKit提供了许多类来控制文本的布局,比如NSTextStorage、NSLayoutManager和NSTextContainer。此外,NSAttributedString对象在整个TextKit中被广泛使用。
31- What is the difference between try? and try! ?
try? 允许我们忽略我们的错误变成nil。 我们使用try! 我们的函数永远不会遇到错误。
32- What is the difference between the cocoa touch class and the normal swift class?
如果我们选择Swift File,下一个屏幕将显示你的文件名并选择保存位置。 当我们从这里点击“创建”,我们只是得到一个空的(ish) Swift文件与我们选择的名称。 它们不提供不同类型的类。它们只是提供不同的文件模板。
33- Explain OptionSet
选项集类似于枚举,但OptionSet的设计是一次工作多个。 我们可以说enum是排他状态,OptionSet是包含状态。对于创建OptionSet,有一个要求是整数类型的属性rawValue和一个初始化器。 OptionSet不是集合。
34- Explain the unified logging system
统一日志系统是一种新的日志机制,取代了print, NSLog是苹果推荐的日志方式。 统一日志的目的提高了我们应用程序的隐私性。我们使用操作系统框架,我们需要跟踪活动和日志操作来诊断我们的应用程序中的问题。
35- Explain Address Sanitizer
地址杀毒器监视内存损坏和缓冲区溢出。 它既适用于模拟器,也适用于重新编译后的设备。我们也可以使用编译器优化级别None [-O0]或最多Fast [-O1]。
我们可以在运行单元和UI测试时启用它。
36- Explain the Single Responsibility Principle
它是一种软件开发原则,使我们能够很容易地理解对象和对象函数。它在SOLID原则中排名第一。根据这一原则,它必须是方法或类的唯一任务。 如果我们说的是方法,那么在一个方法中加载的函数不应该超过一个。
37- Explain App thinning
应用程序细化是切片、位代码和按需资源(odr)的组合。这种组合会自动检测用户的设备型号,并且只允许特定设备的相关下载。
-
当用户需要资源时,使用app时,从苹果服务器后台按需下载资源(图像、数据)。 所有下载内容使用标签。
-
Bitcode为最新的编译器编译应用程序,并为特定的架构优化它。
-
根据苹果的说法,“Slicing”是针对不同目标设备创建和交付应用包变体的过程。
当用户使用完资源后,它会自动从内存中清除。
38- What is the difference between setUp() and tearDown() in XCTestCase ?
我们使用这两种方法进行分配。在执行测试方法之前调用setUp方法。 在执行所有测试方法后,调用tearDown方法来清除我们在数据中所做的任何更改。
39- Explain Asset Catalogs
我们使用资产目录来存储图像,如图标或图像。从iOS 11开始,我们可以在资产目录中存储命名的颜色。 资产目录的另一个鲜为人知的特性是,我们可以存储任意的数据资产。 在iOS 13中,我们可以定义暗模式图标和图像。
40- Explain Dispatch Barriers
Dispatch barriers 是一组充当串行队列样式对象的函数。它创建了异步执行,并帮助我们将线程不安全的对象变成线程安全的对象。 Dispatch barriers 保证了在使用并发性进行读取时不发生写操作,在进行写入时也不发生读操作。
41- What can breakpoint do?
- 通过双击断点并打开编辑器,可以在断点处添加我们忘记的代码行。
- 我们可以改变app的状态。p是另一个LLDB命令来查看当前对象的调试表示。
- 我们可以在控制台中使用po命令来打印调试描述并查看当前值。
- 我们可以改变值来测试我们的代码,而不需要编译并返回您的代码。
42- Explain Opaque Return Types
我有一个使用协议的类。当我用一个函数返回这个类时,它将返回一个错误。 因为Swift编译器不知道这些类是什么。 当添加some到错误函数的返回类、结构或协议时没有问题
43- Explain Autoclosures
@autoclosure在表达式周围创建一个自动闭包。当我们编写一个表达式时,@autoclosure会自动封装到一个闭包中。
44- Explain UIScene Life Cycle
Unattached
场景开始于独立状态。如果一个请求来自用户,它将进入前台状态。 如果一个请求来自系统,它将留在后台。
Suspended
这个场景没有任何作用。
Background
场景不会出现在用户面前。从后台来看,状态可以是未绑定的,可以是挂起的,也可以是移动到前台的。
Foreground
场景呈现给用户。
45- Explain Hashable type
如果将该类型设置为可哈希类型,如结构体或枚举,则可以传递自己的对象。 因为在Swift中,enum是自动哈希的。这将提供一个唯一的标识符。我强烈推荐观看WWDC 2019的UI Data Sources session。
46- Explain Dynamic Var usage
我使用KVO来逐个触发事件。strong var 无法检测此触发器。 当将dynamic放在变量的开头时,可以检测到此触发器
47- Explain UIViewRepresentable requirements
UIViewRepresentable协议有两个我们需要添加的需求:一个makeUIView(context:)方法和一个updateUIView(_:context:)一个用来配置视图并响应任何变化的方法。
48- Explain Dynamic Member Lookup
类型声明的DynamicMemberLookup属性。 子类可以访问父类的动态成员查找功能
49- Explain Result Type
Result类型实现为具有两种情况的枚举:成功回调和失败回调。Result还有其他四个方法:map()、flatMap()、mapError()和flatMapError()。 每一种方法都赋予了您转换成功或错误的能力。
50- Explain Scene Delegate
有了scene委托,iOS应用程序可以有多个场景,这让我们可以在iOS和iPadOS上构建多窗口应用程序。