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

iOS工程师必看的 20 道 面试题

类(class)和结构体(struct)有什么区别? Swift 中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。...class有这几个功能struct没有的: class可以继承,这样子类可以使用父类的特性和方法 类型转换可以在runtime的时候检查和解释一个实例的类型 可以用deinit来释放资源 一个类可以被多次引用...Objective-C中,字符串,数组,字典,皆被设计为引用类型。 值类型相比引用类型,最大的优势在于内存使用的高效。值类型在栈上操作,引用类型在堆上操作。...Swift中若要使用Objective-C代码,可以在ProjectName-Bridging-Header.h里添加Objective-C的头文件名称,Swift文件中即可调用相应的Objective-C...Swift文件中若要规定固定的方法或属性暴露给Objective-C使用,可以在方法或属性前加上@objc来声明。

3.8K40

Swift学习总结

17、swift不允许直接用索引下标[]来访问字符串中的指定字符,因为swift无法在不遍历前面每个字符的情况下知道指定的索引对应于哪个Unicode标量,该索引必须要先获取到start索引,再通过编译计算到指定索引...实例变量不是相同的类型——如果你有一个String变量,就无法在不展开可空实例的情况下将String?的值赋予给这个变量。...或者 .enumvalue 8、创建项目中,入口文件main.swift没有main函数 在main.swift 创建其它文件的结构或类,不需要import对应文件 9、结构体Struct也是可以声明自己的方法...但是声明为常量的引用类型实例的属性却可以被修改。 建议不要在值类型内使用引用类型,确实需要再结构体内使用引用类型,最好使用不可变的实例。...7、swift内存管理采用ARC(自动引用计数) 默认情况下创建的类实例是强引用,可用关键字week声明为弱引用。弱引用必须是var声明,且可空。 在实际应用中,注意避免循环引用。

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

    Swift 周报 第三十二期

    具有 Deinits 的类型的部分消耗 禁止使用 deinits 部分消耗不可复制类型,因为当字段被部分消耗,允许该类型被销毁 例如: struct E : ~Copyable struct S : ~...API,例如 “链接器集”(见下文)或自定义每种类型元数据,如 SE-0385 中所述(swift-evolution/proposals/0385-custom-reflection-metadata.md...属性,将全局变量或顶级函数放入具有该名称的节中,大致相当于 C/C++ 中的 attribute((section("..."))) 。...强制优化管道已经使整数文字、元组和简单算术表达式进行“静态初始化”,如果存在任何具有 @section 属性的全局变量,可以在 SIL 管道末尾明确拒绝编译 这不是静态初始化的。...Swift 中的宏扩展基于语法的内存表示,这意味着无法在不手动执行扩展的情况下直接从源文件中检索扩展的代码。

    29830

    【基本功】深入剖析Swift性能优化

    对于基本数据类型的Struct来说,没有堆内存分配和引用计数的管理,性能更高更安全,但是对于复杂的结构体,如: // Reference Counting // Struct containing references...基本类型的Struct在栈区分配内存,无引用计数管理。 包含强类型的Struct通过指针管理在堆区的属性,对结构体的拷贝会创建新的栈内存,创建多份引用的指针,Class只会有一份。...>bar(local) //在调用内部bar方法时,会使用foo已经绑定的变量类型Point,可以看到,泛型T在这里已经被降级,通过类型Point进行取代 泛型方法调用的具体实现为...静态多态前提下可以进行进一步的优化,称为特定泛型优化。 泛型特化 静态多态:在调用站中只有一种类型 Swift使用只有一种类型的特点,来进行类型降级取代。...下表为不同的数据结构在不同情况下采取的分派方式: ?

    1.5K10

    使用 Swift 提高代码质量

    Bool {} report("1") // 编译器会警告 report2("1") // 不处理返回值编译器不会警告 元组 避免过长的元组 元组虽然具有类型信息,但是并不包含变量名信息,使用方并不清晰知道变量的含义...如果属性/方法申明为@objc还会生成对应的方法列表。 提示:struct无法代替class的一些场景:1.需要使用继承调用super。2.需要使用引用类型。3.需要使用deinit。...4.需要在运行时动态转换一个实例的类型。 提示:不是所有struct都会保存在栈上,部分数据大的struct也会保存在堆上。 集合元素使用值类型 集合元素使用值类型。...a.append(1) } var a = [1, 2, 3] append_one_in_place(&a) 使用isKnownUniquelyReferenced实现写时复制 默认情况下结构体中包含引用类型...如果是let变量,编译器可以保存值复制或引用,避免使用Box。 总结 个人从Swift3.0开始将Swift作为第一语言使用。

    4.7K30

    Swift 5.2 将实例作为函数调用

    Swift 5.2中的一个新功能是可以将类型实例作为函数调用(callAsFunction)。或者,如Swift Evolution 提案所述,“用户定义的标称类型的可调用值”。...尽管这很酷,但您可能更想知道这样的功能在实际编程过程中何时有用,以及如何在代码中应用它。 Swift不是唯一允许其用户调用某些类型的实例作为函数的语言,比如: Python:object....在Swift中使用callAsFunction相对简单。任何定义callAsFunction方法的对象都可以视为一个函数。...您的callAsFunction可以接受参数并返回值,如Swift Evolution建议中所示,并带有以下示例: struct Adder { let base: Int func callAsFunction...callAsFunction 由于callAsFunction方法是一种普通方法,因此可以使用其声明名称引用callAsFunction方法,并获取捕获self的闭包。

    2.4K10

    为自定义属性包装类型添加类 @Published 的能力

    ,但适用于 NSUbiquitousKeyValueStore ),来展示如何为其他的自定义属性包装类型添加可访问包裹其的类实例的属性或方法的能力。...本文中为其他属性包装类型添加的类似 @Published 的能力是指 —— 无需显式设置,属性包装类型便可访问包裹其的类实例的属性或方法。...在有关 Property Wrappers 的文档中,对于如何在属性包装类型中引用包裹其的类实例是有特别提及的 —— Referencing the enclosing 'self' in a wrapper...提案者提出:通过让属性包装类型提供一个静态下标方法,以实现对包裹其的类实例的自动获取(无需显式设置)。...上面的代码也解释了为什么在使用了属性包装器后,无法再声明相同名称(前面加下划线)的变量。 // 在使用了属性包装器后,无法再声明相同名称(前面加下划线)的变量。

    3.4K20

    苹果 AI 部分性能超过 GPT4 | Swift 周报 issue 59

    为保证兼容性,Swift 基金会采用了一些策略,如兼容性检查和在 Objective-C 客户端中保留/自动释放结果。Swift 的严格类型检查有助于解决一些常见的兼容性问题,如误用可变性和空值。...4) 提议删除引用静态成员时对“Self.”的要求内容大概提议内容:建议移除在实例成员中引用静态成员时需要使用 Self. 前缀的要求。认为 Self. 前缀增加了代码噪音,不必要。...背景:传统面向对象语言(如 Pascal、C++ 和 Java)允许直接引用静态成员,无需额外限定符。问题示例:开发者为避免使用 Self. 前缀,经常将私有常量移到类/结构体外部。...这种做法不理想,因为常量应该只在特定类型内部使用。提议者观点:认为调用者不应关心某个成员是静态的还是实例相关的。希望能在类型内部定义静态常量并直接使用。...Swift语法明确规定了$前缀标识符的使用,如:实际上,编译器仅在特定情况下禁止使用$前缀标识符。

    15600

    Swift开发规范-修订版

    上不用加任何修饰符,修饰符加在 extension 内的变量或方法上;说明:目的是当修改extension中某个方法的访问限制时,不需去考虑外部的extension访问限制,降低影响面。...【推荐】尽可能利用访问限制修饰符控制类、方法等的访问限制,遵循开闭原则;说明:如确定某方法或变量不应该被外部调用,就使用private进行修饰,编译程序阻止外部不合适的调用。...函数左大括号不另起一行,与名称之间留有空格; 【强制】代码中的空格出现地点 注释符号与注释内容之间有空格; 类继承,参数名和类型之间等,冒号前面不加空格,但后面跟空格; 任何运算符前后有空格; 表示返回值的...【强制】避免强制解包以及强制类型映射,尽量使用if let 或 guard let进行解包,禁止try!...,避免循环引用,定义属性的时候使用 weak 修饰; 【推荐】能用struct解决的,尽量使用struct而不是class;说明:struct 属于值类型,并且运行在栈上,使用其有两个好处:一是效率高,

    1.7K50

    Swift5.0的Runtime机制浅析

    OC类的派生类并且重写了基类的方法 如果在Swift中的使用了OC类,比如还在使用的UIViewController、UIView等等。...那么问题就来了,方法调用时对象如何被引用和传递呢?在其他语言中一般情况下对象总是会作为方法的第一个参数,在编译阶段生成的机器码中,将对象存放在x0这个寄存器中(本文以arm64体系结构为例)。...这样在访问对象的属性时会通过偏移表中的偏移量来读取偏移信息,然后再根据偏移量来读取或设置对象的成员变量数据。...同时源代码中定义的函数的参数在编译时也不会插入附加的参数。Swift语言会对所有符号进行重命名修饰,类方法和全局函数也不例外。这也就使得全局函数和类方法也支持名称相同但是参数不同的函数定义。...虽然可以将方法函数名称赋值给某个变量,但是这个变量的值并非是类方法函数的真实地址,而是一个包装函数的地址。 第二个就是Swift中的类方法调用和参数传递的ABI规则和其他语言不一致。

    2.3K21

    Swift:内存管理和值类型的性能

    实际上,在使用一个或另一个之间的选择总是归结为值语义和引用语义,但是两者之间的性能差异是可表达的,并且取决于对象的内容,尤其是在处理值类型时,它们之间可能会偏重一个或另一个。...只要在编译时就知道值类型的大小并不被递归地包含/包含在引用类型中,那么它将不需要使用引用计数,并且它的生命周期将是静态的 static ——等于其作用域的生命周期。...struct EmptyStruct { private let number: Int64 = 1 //默认情况下,空类的指针具有64位存储空间 //因此我们要在结构体中添加64...堆与栈一样,与具有相同名称的数据结构没有太大区别,在这种情况下,它应用于动态分配的用户管理的内存。 当进程请求一定数量的内存时,堆将搜索一个满足该请求的内存地址,并将其返回给进程。...在所有其他情况下,定义一个类,并创建该类的实例以通过引用进行管理和传递。实际上,这意味着大多数自定义数据构造应该是类,而不是结构体。 还有什么?

    99620

    Swift基础 属性

    这种行为是由于结构是值类型。当值类型的实例被标记为常量时,其所有属性也是如此。 类的情况并非如此,类是参考类型。如果您将引用类型的实例分配给常量,您仍然可以更改该实例的变量属性。...存储属性和实例变量 如果您有Objective-C的经验,您可能知道它提供了两种存储值和引用作为类实例的一部分的方法。除了属性外,您还可以使用实例变量作为存储在属性中的值的备份存储。...存储的变量,如存储的属性,为特定类型的值提供存储,并允许设置和检索该值。 但是,您还可以在全局或局域范围内定义计算变量并为存储变量定义观察者。...这些类型的属性称为类型属性。 类型属性可用于定义特定类型所有实例通用的值,例如所有实例都可以使用的常量属性(如C中的静态常量),或存储该类型所有实例的全局值的变量属性(如C中的静态变量)。...类型属性语法 在C和Objective-C中,您将与类型关联的静态常量和变量定义为全局静态变量。

    23500

    Swift基础 结构和类

    然而,与其他语言相比,Swift结构和类的功能要接近得多,本章的大部分内容描述了适用于类或结构类型的实例的功能。因此,使用了更通用的术语实例。 比较结构和类 Swift中的结构和类有很多共同点。...最简单的初始化器语法形式使用类或结构的类型名称,后跟空括号,如Resolution()或VideoMode()。这会创建一个类或结构的新实例,任何属性都初始化为默认值。...请注意,相同于(由三个相等符号表示,或===并不意味着等于(由两个相等符号表示,或==相同。与类类型的两个常量或变量引用完全相同的类实例相同。...引用某些引用类型的实例的Swift常量或变量类似于C中的指针,但不是指向内存中地址的直接指针,并且不需要您编写星号(*)来指示您正在创建引用。...相反,这些引用的定义与Swift中的任何其他常量或变量一样。标准库提供了指针和缓冲区类型,如果您需要直接与指针交互,您可以使用这些类型,请参阅手动内存管理。

    9900

    Swift性能优化分析

    更加高效的数据类型 在开始讨论Swift数据类型之前,我们先讨论一下Swift的函数派发机制; 静态派发、动态派发、消息派发(static dispatch、dynamic dispatch、message...类(class)和结构体(struct)在内存分配上是不同的,基本数据类型和结构体默认分配在栈区,而像类这种高级数据类型存储在堆区,且堆区数据存储不是线程安全的,在频繁的数据读写操作时,要进行加锁操作。...我们在swift文档里面能看到对结构的描述,结构体是值类型(Value Type),当值类型的数据赋值给一个变量或常量,或者传递给一个函数时,是值拷贝; 例如: struct Resolution {...协议类型(protocol type) 多态是面向对象的一大特性,在结构体中不能通过继承或者引用语言的多态,swift就引入了协议(protocol),通过协议来实现了结构体的多态特性,这也是swift...类里面方法的派发则是根据v-table表里面函数指针来进行派发。 而结构体(struct)没有继承,也就是说结构体并没有v-table表用于函数的派发。

    1.4K30

    Swift基础 方法

    在 Swift 中,您可以选择是定义类、结构还是枚举,并且仍然可以灵活地定义您创建的类型上的方法。 实例方法 实例方法是属于特定类、结构或枚举实例的函数。...如果您没有显式写入self,每当您在方法中使用已知的属性或方法名称时,Swift都会假设您指的是当前实例的属性或方法。...在这种情况下,参数名称优先,有必要以更限定的方式引用该属性。您使用self属性来区分参数名称和属性名称。...更一般地说,您在类型方法正文中使用的任何不合格的方法和属性名称都将引用其他类型级方法和属性。类型方法可以调用另一个类型方法,使用另一个方法的名称,而无需将其前缀为类型名称。...同样,结构和枚举上的类型方法可以通过使用类型属性的名称来访问类型属性,而无需类型名称前缀。 下面的示例定义了一个名为LevelTracker的结构,该结构跟踪玩家在游戏的不同关卡或阶段的进度。

    9600

    Swift 类和结构体

    因此请使用UpperCamelCase这种方式来命名(如SomeClass和SomeStructure等),以便符合标准 Swift 类型的大写命名风格(如String,Int和Bool)。...存储属性是被捆绑和存储在类或结构体中的常量或变量。当这两个属性被初始化为整数0的时候,它们会被推断为Int类型。...构造器语法的最简单形式是在结构体或者类的类型名称后跟随一对空括号,如Resolution()或VideoMode()。通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值。...一个引用某个引用类型实例的 Swift 常量或者变量,与 C 语言中的指针类似,但是并不直接指向某个内存地址,也不要求你使用星号(*)来表明你在创建一个引用。...Swift 中的这些引用与其它的常量或变量的定义方式相同。 类和结构体的选择 在你的代码中,你可以使用类和结构体来定义你的自定义数据类型。 然而,结构体实例总是通过值传递,类实例总是通过引用传递。

    1.2K40

    iOS面试题-Swift篇

    class 有以下功能,struct 是没有的:* class可以继承,子类可以使用父类的特性和方法 类型转换可以在运行时检查和解释一个实例对象 class可以用 deinit来释放资源 一个类可以被多次引用...) 在 Swift 中,可选型是为了表达一个变量为空的情况,当一个变量为空,他的值就是 nil 在类型名称后面加个问号?...来定义一个可选型 值类型或者引用类型都可以是可选型变量 泛型主要是为增加代码的灵活性而生的,它可以是对应的代码满足任意类型的的变量或方法; 泛型可以将类型参数化,提高代码复用率,减少代码量 它们遵循的基本规则...值类型和引用类型相比,最大优势可以高效的使用内存,值类型在栈上操作,引用类型在堆上操作,栈上操作仅仅是单个指针的移动,而堆上操作牵涉到合并,位移,重链接,Swift 这样设计减少了堆上内存分配和回收次数...函数重载是指: 函数名称相同,函数的参数个数不同, 或者参数类型不同,或参数标签不同, 返回值类型与函数重载无关 swift 支持函数重载swift 中的枚举,关联值 和 原始值的区分?

    3.6K40

    iOS_Swift函数派发机制

    / Enum Struct 和 Enum 为值类型,不支持继承,它不需要一个 Table 来记录方法信息。...其他的函数:以 Table 的机制来查找调用的。 2.3 Class - Extension extension 中的方法和属性无法继承和重写,只属于当前类,所以是静态派发的。...,在有优化的情况下,编译器会尽可能地将方法变成静态派发 ,有的方法甚至会就地展开,变成 inline 的形式,以便提升性能。...2.5 Protocol 对象 无论真实对象是值类型还是引用类型,都使用 Table dispatch ---- 2.6 修饰符 2.6.1 @objc/@nonobjc: @objc/@nonobjc...@objc:是将是 swift 中 继承自 NSObject 类的函数暴露给 OC。原理:生成两个函数引用,一个给 swift 调用,一个给 objc 调用。

    20010

    iOS-Swift 方法

    在结构体和类内部的方法中,引用当前实例的属性时,一般情况下可以不用在属性前加 self 关键字,比如 self.age 可以直接将 self. 省略,写成 age。...一、函数相关的修饰符 1. mutating 构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改,在 func 关键字前加 mutating 可以允许这种修改行为。...并且添加了 final 关键字的函数无法被重写,使用静态派发,不会在 vtable 中出现,且 对 objc 运行时不可⻅。...定义一个 SHPerson 类型,调用方法,并且打上断点,如下: 打个断点,来看一下 Swift 类的方法在汇编的调用情况。...x0 中 (滑动显示更多) orr: 将某一寄存器的值和另一寄存器的值 按位 或 并将结果保存到另一寄存器中, 如: orr x0, x0, #0x1 // 将寄存器 x0 的值和常量 1 按位或后保存到寄存器

    3.1K40

    iOS_Swift函数派发机制

    / Enum Struct 和 Enum 为值类型,不支持继承,它不需要一个 Table 来记录方法信息。...其他的函数:以 Table 的机制来查找调用的。 2.3 Class - Extension extension 中的方法和属性无法继承和重写,只属于当前类,所以是静态派发的。...,在有优化的情况下,编译器会尽可能地将方法变成静态派发 ,有的方法甚至会就地展开,变成 inline 的形式,以便提升性能。...2.5 Protocol 对象 无论真实对象是值类型还是引用类型,都使用 Table dispatch ---- 2.6 修饰符 2.6.1 @objc/@nonobjc: @objc/@nonobjc...@objc:是将是 swift 中 继承自 NSObject 类的函数暴露给 OC。原理:生成两个函数引用,一个给 swift 调用,一个给 objc 调用。

    27820
    领券