Tag: 面试问题

iOS面试问题🤯😖😒

1.我们在Objective-C中有扩展吗? 答案是肯定的。 2.目标C中类别和扩展名之间的区别? 可以为任何类声明一个类别,即使您没有原始的实现源代码。 类扩展与类别具有某些相似性,但是只能将其添加到您在编译时拥有源代码的类中(该类与该类扩展同时进行编译)。 类别使您可以在主界面文件之外添加方法。 而扩展名必须在主接口文件中实现。 这意味着我们可以确定,您不能使用扩展来扩展内置类或没有源代码的类,而应该使用类别。 要使用扩展,您需要访问要扩展的类的源。 3. Fallthrough关键字很快? 在Swift中, switch语句不会落入每种情况的底部而进入下一种情况。 即,第一个匹配的情况一旦完成,整个switch语句就完成其执行。 快速地,在切换案例中使用fallthrough语句来执行case语句,根据我们的要求,case语句位于匹配的case语句旁边。 fallthrough关键字不检查导致执行陷入的switch条件的条件。 fallthrough关键字仅导致代码执行直接移至下一个case(或default case)块内的语句,就像C的标准switch语句行为一样。 4.如何使协议中的方法快速可选? 我们可以通过两种方式做到这一点。 纯快捷方式应类似于使用protocol extension提供默认实现。 目标— C兼容性的方式是使用@objc和optional关键字。 重要: objc的缺点-兼容性方式是上MyProtocolObjc 中的 MyProtocolObjc 成为一个类-仅协议 。 结构不符合该协议。 错误: 非类类型’SomeStruct’不符合类协议’MyProtocolObjc’ 5.反转字符串而不使用“ reversed()”内置函数 如果面试官要求您将代码写在纸上,请当场杀死他。 对我来说,没有xcode编写优化代码真的很困难。 上次问这个问题时,这是我首先想到的。[笔和纸的方法]。 扩展字符串{ func reverse()->字符串{ var tempString =“” 对于自我中的字符{ tempString =字符串(char)+ tempString } 返回tempString } } 我能够剪切-使用Playgrounds将其拍摄到Playgrounds 。 您可以在字符串上使用高阶函数“ […]

Swifts中的非递增数组

LeetCode有一个有趣的问题,即非递增数组。 给定一个具有n整数的数组,您的任务是通过最多修改1元素来检查它是否可以不减少。 如果array[i] <= array[i + 1]对每个i (1 <= i <n)成立,则我们定义数组为非递减array[i] <= array[i + 1] 。 因此(为什么我们不使用术语“增加”来表示不减少,我永远不会知道),我们正在寻找造成增加的情况: 而不是减少: 并且我们可以在数组中进行一个更改。 在这里重要的是在遍历数组时不要更改数组,而要在遍历数组时做出决定。 简单的情况 简单的情况如下所示,我们可以将数组中的第一个元素更改为1,从而增加数组 天真的(不正确的)解决方案 这是Swift中的代码: 为了使下面的数组增加一个[3,4,2,3],天真的解决方案声称在数组中只需要进行单个更改就给出了错误的答案: 这是因为幼稚的解决方案假定我们可以更改“不正确”的元素i,使得array [i]≥array [i_1] && array [i]≥array [i + 1]。 对于第三个元素,这是不可能的-即使我们将元素更改为4或5,它仍将大于数组(3)中的第4个元素。 更改元素时,我们尝试始终与之前的元素进行比较。 在第一种情况下,这是行不通的,因此我们可以将其从代码中排除-我们在元素中存在“ dip”的位置识别出此问题。 不正确的代码 我们在数组的第一个和最后一个元素中考虑了边缘情况: 在这里,我们有一个与上面类似的情况,但是逻辑失败了,因为我们有了一个新的情况。 我们可以在这里减少最大元素(2),并且我们有一个不减少(增加)的数组。 Se可以使用相同的示例演示算法如何逐步解决此问题(并且我们正在寻找count> 1以指示需要进行多次更改): 这是完整的代码。 请注意,我们不仅添加了以下条件: 如果 i!= 1 && nums [i — 2]> nums […]

60面试问题每个iOS开发人员都应该知道。 (第1部分)

在这第一篇博客文章中,我试图介绍有关ObjectiveC的简单问题。 所有问题的答案均​​来自多个来源。 如果您对以下任何问题有更好的答案,请将其作为评论发送。 (此博客的版权归所有在多个博客,QnA网站和Apple Developer文档中提到这些答案的开发人员所有) 1.解释什么是Objective-C协议。 协议声明了任何类都可以选择实现的程序接口。 协议使通过继承关系远的两个类彼此通信以实现某个目标成为可能。 在这里阅读更多。 2.解释协议的类型。 正式协议声明了客户端类应实现的方法列表。 正式协议具有自己的声明,采用和类型检查语法。 您可以使用@required和@optional关键字来指定其实现是必需的还是可选的方法。 子类继承其祖先采用的正式协议。 正式协议也可以采用其他协议。 正式协议是对Objective-C语言的扩展。 非正式协议是NSObject上的一个类别,它隐式地使几乎所有对象都采用该协议。 (类别是一种语言功能,使您可以将方法添加到类中而不对其进行子类化。)在非正式协议中实现方法是可选的。 在调用方法之前,调用对象将检查目标对象是否实现了该方法。 在Objective-C 2.0中引入可选协议方法之前,非正式协议对于Foundation和AppKit类实现委派的方式至关重要。 3.解释什么是#import。 #import确保文件只包含一次,因此您不会遇到递归包含的问题。 4. Objective-C中的#import和#include有什么区别? 导入是包含的超级集,它确保文件仅包含一次。 这样可以避免递归包含。 关于“”和。 在本地目录中搜索“”,<<用于系统文件。 5,Objective-C中类别的用途是什么? 通常,您可以使用类别将方法添加到现有类中,例如Cocoa框架中定义的方法。 所添加的方法由子类继承,并且在运行时与类的原始方法没有区别。 您还可以使用自己的类的类别来:将自己的类的实现分发到单独的源文件中-例如,您可以将一个大类的方法分组为几个类别,然后将每个类别放入一个不同的文件中。 声明私有方法。 #import“ SystemClass.h” @interface SystemClass(类别名称) //方法声明 @结束 6.类别的局限性和问题? 优点:您可以扩展没有源的任何类,甚至那些类。 例如,查看Apple添加到NSString类的UI扩展,以进行渲染,获取指标等。由于您可以访问所有实例变量,因此类别为您提供了一种使用逻辑在跨编译单元的结构化代码的好方法分组,而不是例如Java采取的“必须全部在一个物理位置”进行分组。 缺点:您不能安全地覆盖该类本身或另一个类别已经定义的方法。 7.说明何时使用NSArray和NSMutableArray。 哪一个更快且线程安全? NSArray及其子类NSMutableArray管理称为数组的对象的有序集合。 NSArray创建静态数组,NSMutableArray创建动态数组 在这里阅读更多。 8.什么是快速枚举? 该对象通常是诸如数组或集合之类的集合。若干个Cocoa类(包括集合类)采用NSFastEnumeration协议。 您可以使用它来检索实例持有的元素,其语法类似于标准C for循环的语法,如以下示例所示: NSArray * […]