首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【面试必备】Swift 面试题及其答案

函数式编程倾向于值类型,面向对象编程更喜欢。 在Swift 中,和结构体有许多不同特性。下面是两者不同总结: 支持继承,结构体不支持。...2、解决强引用循环问题——当两个实例对象相互引用,并且对引用实例对象值要求不能为nil时候。在这种情况下,引用一方可以标记为unowned,另一方使用隐式拆包。...答案:Swift是一种混合编程语言,包含这两种编程模式。实现了面向对象三个基本原则: 封装 继承 多态 说道Swift作为一种函数式编程语言,我们就不得不说一下什么是函数式编程。...很难说Swift一个成熟函数式语言,但是已经具备了函数式语言基础。 问题2- Swift 1.0 or later 下面的功能特性都包含在Swift?...只要一个对象被另一个对象强引用,那么该对象就不能被释放,由于强引用存在,每个对象都会保持对方存在。 解决这个问题方法是,用weak或者unowned引用代替其中一个强引用,来打破循环引用。

2.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

【面试必备】Swift 面试题及其答案

---- 答案:一直都有这样争论:到底是用做法优于用结构体,还是用结构体做法优于函数式编程倾向于值类型,面向对象编程更喜欢。 在 Swift 中,和结构体有许多不同特性。...2、解决强引用循环问题——当两个实例对象相互引用,并且对引用实例对象值要求不能为 nil 时候。在这种情况下,引用一方可以标记为 unowned,另一方使用隐式拆包。...---- 答案:Swift 是一种混合编程语言,包含这两种编程模式。实现了面向对象三个基本原则: 封装 继承 多态 说到 Swift 作为一种函数式编程语言,我们就不得不说一下什么是函数式编程。...很难说 Swift一个成熟函数式语言,但是已经具备了函数式语言基础。 问题2- 下面的功能特性都包含在 Swift?...只要一个对象被另一个对象强引用,那么该对象就不能被释放,由于强引用存在,每个对象都会保持对方存在

6.2K30

iOS学习--NSObject详解

:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); /** 获取方法签名, 对象没有找到SELIML时就会执行调用该方法, 可以重写该方法抛出一个函数签名...(""); 2.3、复制方法 /** 复制为不可变对象 */ - (id)copy; /** 复制为可变对象 */ - (id)mutableCopy; 2.4、判断方法 /** 判断对象是否给定给定子类实例...*/ - (BOOL)isKindOfClass:(Class)aClass; /** 判断对象是否给定实例 */ - (BOOL)isMemberOfClass:(Class)aClass;...NSObject */ - (BOOL)isProxy; /** 判断对象是否给定给定子类实例 */ - (BOOL)isKindOfClass:(Class)aClass; /** 判断对象是否给定实例...:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); /** 获取方法签名, 对象没有找到SELIML时就会执行调用该方法, 可以重写该方法抛出一个函数签名

1.1K20

Swift学习总结

String对象,虽然其本身不是一个集合,但是其底层内容确实以集合形式存在,字符串characters属性表示组成这个字符串字符集合。...18、swift任何类型都可以用可空类型来说明一个实例可能是nil,而objc-c只允许对象是nil 19、声明实例变量时,在类型后跟随问号?,则表示该变量是可空类型,可以为nil,也可以赋了值。...swift增加一个惰性存储属性概念,用lazy关键字修饰,惰性储存属性值只在第一次访问时候才会出现,因为依赖类型外部因素,必须要满足某些前提条件才能计算得到。...do { try//用try关键字标记存在异常方法 } catch { //在这里我们可以 } Swift允许二次抛出异常,在调用可能存在异常方法时,用try标记,但是可以不用do catch,而是让当前方法声明上标记...Swift是不可以访问实例引用计数,但是有个函数(isKnownUniquelyReferenced)可以判断一个实例是否是对某个实例唯一引用。

3K20

Swift中使用工厂进行依赖注入

这使我们更容易看到一个给定对象有哪些确切依赖关系,同时也使测试变得更加简单——因为可以模拟依赖项以捕获和验证状态和值。...然而,尽管它很有用,但如果在一个项目中广泛使用,依赖注入也会成为一个相当大痛点。随着一个给定对象依赖数量增加,初始化它可能成为一个相当麻烦事情。...由于MessageViewController需要一个MessageSender实例我们也需要让MessageListViewController知道这个。...使其不再接受其依赖实例——现在只接受一个工厂。...由于我们已经将所有的工厂定义为协议,我们可以通过实现任何给定工厂协议特定测试版本,在测试中轻松地模拟它们。我将在未来博文中写更多关于模拟和如何在测试中充分利用依赖注入内容。 你怎么看?

82020

Swift 周报 第三十八期

我们正在努力增加对 Swift 项目正式支持所有 Linux 发行版支持。 讨论Swift 测试新方法[7] 我很高兴地宣布一个开源项目,旨在探索 Swift 测试体验改进。...受到 Swift启发,我们构建了一个测试库 API,它可以: 使用名为 @Test 附加宏提供有关各个测试详细信息。...这是一个示例:显示了一个测试函数,使用 @Test 表示,其中包含两个特征:自定义显示名称和决定测试是否应运行条件。...我想知道是否可以将两者删除。 特别是,@Sendable 属性意味着传递给闭包类型必须是 Sendable,这施加了相当严格限制。因此,如果我们可以省略,那就方便多了。...首先,文章回顾了 Store 类型定义,允许我们可预测地实现状态管理,但这个类型不是线程安全。为了解决这个问题,文章使用了一个 NSRecursiveLock 类型实例来确保线程安全。

22030

202 - Swift 核心是什么?

要回答这个问题,我们可以参考一下刚刚提到面向对象编程,在面向对象编程里,是从一个 class 开始,那要是照这样说,在面向协议编程里就是从一个 protocol 了吗?这样解释对不对呢?...我们前面也说过了 class 是面向对象东西,那我们试试用 struct,现在可以新建一个 struct,然后让遵守我们 protocol 就可以了,之后就可以实例一个 struct,接着就可以用...NSObject ,也就是说都是 class 类型,比如在开发中有几十个控制器都继承自某个自定义,就会把基所有的方法也继承下来,但是这些方法对每一个子类都有用?...答案肯定是否。所以,既然子类不需要,何必要继承父方法呢?自己方法应该由自己决定才对,而现在是基帮着子类决定了方法。...我想大多数人第一反应应该是 struct 是值类型 class 是引用类型,也就是说 struct 实例在被赋予变量或者常量或者被函数调用时都会被复制,但是 class 实例会被引用,引用就是已经存在实例本身而不是复制

95120

Swift5.0Runtime机制浅析

导读:你想知道Swift内部对象是如何创建?方法以及函数调用又是如何实现?成员变量访问以及对象内存布局又是怎样?这些问题都会在这篇文章中得到解答。...Swift对象实例都是在堆内存中创建,这和OC语言对象实例创建方式相似。系统会为提供一个默认init构造函数,如果想自定义构造函数则需要重写和重载init函数。...一个Swift对象实例构建分为两部分:首先是进行堆内存分配,然后才是调用init构造函数。...一个令人高兴事情就是Swift结构定义部分是存放在可读写数据段中,这似乎给了我们一个提示是说可以在运行时通过修改一个Swift函数内容来达到运行时对象行为改变能力。...回过头来Swift函数调用函数表方式,因为根据虚函数定义需要把一个所有方法函数地址都存放到函数表中,而不管函数是否有被调用或者使用。

2.2K21

Swift入门:

可以一个定义为基于另一个,添加任何您想要新内容。 当你创建一个实例时,它被称为一个对象。如果复制该对象,默认情况下,两个副本都指向同一个数据——更改一个,副本也会更改。...这在结构体中很好,因为Swift会自动为我们生成一个成员初始化器,强制我们为这两个属性提供值,但这不会在中发生,因此Swift无法确定它们是否会被给定值。...self.name = name self.age = age } func sing() { print("La la la la") } } 我们现在可以通过调用该初始化器来创建该对象实例...在处理对象时,你会看到super经常被使用,意思是“在我继承上调用一个方法”。通常被用来表示“让我先做需要做所有事情,然后再做额外事情。”...对于对象每个副本都指向同一个原始对象,因此如果更改一个,它们都会更改。Swift调用结构体“值类型”,因为它们只指向一个值,而“引用类型”,因为对象只是对实际值共享引用。

73510

译:如何用Swift进行TDD(测试驱动开发)

如果你还没有用类似Swift编译型语言进行过TDD,你可能想问:如果测试引用对象存在,你怎么进行代码编译,又怎么进行TDD呢?...相对于类似Swift编译型语言,类似Ruby和JavaScript解释型语言可能天生更适合TDD,因为你可以编写不存在测试对象,并且不会产生编译错误。 所以该如何用编译型语言进行TDD?...为了说明这一点,我们对Project进行TDD,我们希望创建一个字典,这样之后可以进行序列化。...1、创建一个测试和你想要存在实例 因为我们想要测试是创建一个Project字典,我们需要一个Project实例(当前并不存在)。...好,我们可以继续进行。 测试状态:红色。 4、编写你想要存在方法 在Project里,我们现在可以实现asDictionary方法了,但是注意我们要用最简短代码来通过测试

1.2K110

OC对象原理(二)

第二位has_assoc是关联对象标志位,0表示没有关联对象,1表示存在关联对象 第三位has_cxx_dtor表示该对象是否有C++或者Objc析构器,如果有析构函数,则需要做析构逻辑,如果没有,则可以更快地释放对象...第37位到第42位是magic,它用于调试器判断当前对象是真的对象还是没有初始化空间 第43位是weakly_referenced,标志对象是否有弱引用,没有弱引用对象可以更快被释放 第44位是deallocating...,标志对象是否正在释放内存 第45位是has_sidetable_rc,当对象引用计数大于10 时候,需要借助该变量存储进位。...在内存中只有一份 通过上面的分析我们知道,实例对象可以创建多个,并且每个实例对象内部第一个属性isa会指向该实例对象所对应,那么现在有个问题,指向这个内存是固定?...或者说,对象可以创建多份

71910

如何在Java和Swift中避免空引用异常?

因此,使用这两种方法都与直接使用空值对象有一样风险。我们从 Optional中得到一个好处是,提供了一组更高阶函数,这些函数可以被链接起来,不必担心值是否存在。...Null Checks 让我们设计一个简单示例,其中有两个用户和地址,其中用户中必需字段只有用户名,地址中必需字段是street和number。...在Java 10引入了一个更好 Optional.orElseThrow ——使用方式一样,但是方法名是警告说,如果值不存在,将抛出一个异常。...Swift可选实际上是一个枚举,它有两种状态:none和some,其中none表示nil, some表示一个已wrapped对象。...许多对选项调用可以链接在一起,因此命名为可选链接。这样表达式总是返回一个可选项,如果链中任何可选项都不包含,则该表达式将包含结果对象或none。因此,必须再次检查可选链结果是否为nil。

2.7K30

聚焦位置-选择您喜欢位置放置虚拟物体

焦点方块 Focus Square 首先,我们将为Focus Square创建一个,以便我们可以个性化其风格和状态。让我们为焦点方块添加一个Swift文件。...初始化 在中,我们将定义一个初始化程序,这样每当我们创建一个焦点方形节点时,它将执行一些额外步骤。作为其父级,SCNNode具有自己属性。要添加新我们需要覆盖。...真棒,我们刚刚完成了课程,但我们还没有看到变量 为此,请转到ViewController.swift文件。我们将首先在sceneView声明之后为焦点方块声明一个变量。...func updateFocusSquare() {} 在那里,再次使用变量在本地实例一个焦点方块。另外,请确保它是第一手存在。...self绝对是必需,因为它在一个闭包中并引用了ViewController。不要太担心,随着时间推移,你将会理解所有这些对象,属性和闭包。

2.4K30

平面检测-搜索真实世界表面

ARSCNViewDelegate是一种协议,包含许多方法来帮助跟踪摄像机视图中对象。方法就像程序或例程来实现某些东西。 在编程中,委托是一种设计模式,允许将其职责委托给另一个对象。...当我们时,向下滚动并删除Mark下注释掉代码,这是该协议下一个方法给定示例。Mark帮助我们分离文件中代码段。...如果跟踪对象是平面,让我们进行场景测试。从技术上讲,如果锚是一个ARPlaneAnchor。...运行该应用程序以测试。 返回委托文件,为planeAnchor声明一个常量。我们将使用它作为锚点来放置对象。 let planeAnchor = anchor as!...首先,网格是立起来,另一个问题是你只能看到飞机一侧网格。这是我们需要解决两个问题。 好吧,还记得在我们第一次拖动飞机作为屏幕时手表场景默认方向是垂直。嗯,这里也是如此。

2.9K30

Swift 周报 第三十四期

改提案旨在为包含 Swift 和 C 等基于语言混合源代码目标添加软件包管理器支持。目前,一个目标的源代码可以Swift 或 C 等基于语言(根据SE-0038),但不能同时存在两者。...适用于任何存在输入流进入异步进程并产生与输入相同顺序输出情况。...或者,如果团队关心是这些扩展是否合适,因为添加了在所有 String/Int/ 或其他类型上都不合理使用功能,因此不应该广泛访问,那么更好解决方案可能是引入一个特定于领域类型,包含一个 String...当将一个转换为 AnyObject 时,编译器可以选择保留,但它选择不这样做,因为知道是永久存在,因此可以通过不执行此操作来节省代码大小和运行时间。 这两个局部推理结果导致了遇到问题。...) 如果没有事件对象,这个函数几乎没有意义。文档并没有提到会收到空事件。那么为什么事件是一个可选类型呢?

20540

架构之路 (七) —— iOS AppSOLID原则(一)

Liskov Substitution 程序中对象应该可以用它们子类型实例替换,而不会改变该程序正确性。...您将创建一个抽象,而不是创建一个具体实现符合协议,更具体实现需要子类化该抽象实现了相同目标:您可以轻松地交换底层实现,而无需更改任何视图。...现在可以自由使用任何类型存储,只需对您代码进行最少更改。 3) 添加新报告类型是在枚举中添加新值问题。 4) 创建预览和测试比以前容易得多,而且您不再需要任何复杂模拟对象。...相反,SOLID 为您提供了一些指导方针,帮助您以更有条理方式编写代码。 使修复bug更安全,因为您对象不会纠缠在一起。编写单元测试更容易。即使将您代码从一个项目重用到另一个项目也毫不费力。...无论您是否了解基本 iOS 设计模式,刷新您对它们内存总是好我们 Fundamental iOS Design Patterns tutorial 可以提供帮助。

4.7K10

Swift:静态工厂方法

API更加简约(Swift在很多方面都鼓励使用点语法以及如何缩短导入Objective-C API功能),我们甚至可以我们方法变成一个计算属性,如下所示: extension UILabel...我们甚至可以在静态属性或函数中设置内部“自动布局”约束。...假设我们应用程序中有一个User模型,其中包含给定用户具有什么样权限,并且我们许多测试都是基于当前用户权限来验证我们逻辑。...,从而使我们可以专注于实际测试内容——例如在此处,我们将验证具有deleteFolders权限用户是否可以删除文件夹: class FolderManagerTests: XCTestCase {...文章来自 John SundellStatic factory methods in Swift简单翻译了一下,希望对大家有用 附: 文中静态工厂方法swift5.0才支持 我们可以使用方法实现类似功能

2.4K10

iOS面试资料参考答案总结

,消息转发 消息转发 泛型/元组/高阶函数 有 无 语言效率 性能更高,速度更快 略低 文件特性 .swift 单文件 .h/.m包含头文件 编程特性 可以更好实现函数式编程/响应式编程 面向对象编程...分类是运行时被编译,这时结构已经固定了,所以我们无法添加实例变量。 对于分类自定义Setter和Getter方法,我们可以通过关联对象(Associated Object)进行实现。...在OC中Class也是一种对象,它对应就是 metaclass , metaclass 也是一种对象是root metaclass ,在往上根元(root metaclass)指向自己,形成了一个闭环...关于这一话题深入讨论可以参考这两篇文章: 为什么要存在MetaClass 为什么要设计metaclass 6、方法是存储到什么地方?类属性呢? 方法和类属性都是存储到元。...对比架构时,可以是否职责分离,可测试性,可易维护性三个维度对比。 3、静态库和动态库区别是什么? 静态库:链接时被完整复制到可执行文件中,多次使用就多份拷贝。

1.5K40
领券