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

Swift学习总结

实例变量不是相同的类型——如果你有一个String变量,就无法在不展开可空实例的情况下将String?的值赋予给这个变量。...Swift的枚举,除了像其它语言那样定义一些静态的成员值来枚举可能的状态,还提供了一种强大的特性,可以定义带关联值的成员。关联值能让你把数据附在枚举实例上,不同的成员可以有不同类型的关联值。...17、反初始化就是c++中的析构函数思想,也相当于objc的dealloc,在实例被清除出内存钱会调用到。...我们预期,当把值类型实例赋给新变量、常量或传递给函数时,实例会被复制。...因此我们在赋值或将实例作为参数传递时,在它们没被修改或写入存储时,它们还是对同一份存储进行引用。这样值类型就可以避免创建多余的数据副本。

3K20

Swift基础 通用

您可以创建一个包含Int值的数组,或包含String值的数组,或者为可以在Swift中创建的任何其他类型的数组。同样,您可以创建一个字典来存储任何指定类型的值,并且该类型没有限制。...每次调用swapTwoValues(_:_:)时,都会从传递给函数的值类型推断T的类型。...在每种情况下,每当调用函数时,类型参数都会替换为实际类型。(在上面的swapTwoValues(_:_:)示例中,第一次调用函数时将T替换为Int,第二次调用时替换为String。)...操作中的类型约束 这是一个名为findIndex(ofString:in:)的非通用函数,它给出了一个要查找的String值和一个要查找的String值数组。...上面的示例创建一个Stack实例来存储String值,并将三个字符串推送到堆栈上。该示例还创建一个Array实例,该实例使用包含与堆栈相同的三个字符串的数组文字初始化。

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

    iOS面试题-Swift篇

    在 Swift 中,class 是引用类型(指针类型), struct 是值类型 值类型 值类型在传递和赋值时将进行复制; 赋值给var、let或者给函数传参,是直接将所有内容拷贝一份, 类似于对文件进行...函数重载是指: 函数名称相同,函数的参数个数不同, 或者参数类型不同,或参数标签不同, 返回值类型与函数重载无关 swift 支持函数重载swift 中的枚举,关联值 和 原始值的区分?...关联值--有时会将枚举的成员值跟其他类型的变量关联存储在一起,会非常有用 原始值--枚举成员可以使用相同类型的默认值预先关联,这个默认值叫做:原始值 将一个很长的闭包表达式作为函数的最后一个实参 使用尾随闭包可以增强函数的可读性...非逃逸闭包、逃逸闭包,一般都是当做参数传递给函数// 定义一个数组用于存储闭包类型 var completionHandlers: [() -> Void] = [] // 在方法中将闭包当做实际参数...这个语法的好处在于通过写普通表达式代替显式闭包而使你省略包围函数形式参数的括号 非逃逸闭包:闭包调用发生在函数结束前,闭包调用在函数作用域内 逃逸闭包:闭包有可能在函数结束后调用,闭包调用逃离了函数的作用域

    3.6K40

    Swift 进阶: 泛型

    例如,Swift 的Array 和Dictionary 类型都是泛型集合。 你可以创建一个容纳 Int 值的数组,或者容纳String 值的数组,甚至容纳任何 Swift 可以创建的其他类型的数组。...在不同情况下,用调用函数时的实际类型来替换类型形式参数。(上面的swapTwoValues(_:_:) 例子中,第一次调用函数的时候用Int 替换了T ,第二次调用是用String 替换的。)...▐ 8.2 类型约束的应用 这是一个叫做findIndex(ofString:in:) 的非泛型函数,在给定的String 值数组中查找给定的 String 值。...关联类型 ---- 定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。...上面的例子创建了一个Stack 实例来存储 String 值,压到栈中三个字符串。还创建了一个Array 实例,用三个同样字符串的字面量初始化该数组。

    1.7K20

    Swift 5.6到5.10新特性整理

    下面的非可选`T` 函数在Swift 5.7中可以正常使用。...Type SE-0309 极大地放宽了 Swift 在协议具有 Self 或关联类型要求时禁止使用协议作为类型的限制,转向一个仅基于它们所做的特定属性或方法受限的模型。...例如,Int 符合 Equatable,所以当我们说 4 == 4 时,我们实际上是在运行一个接受两个整数并在它们匹配时返回 true 的函数。...将这些称为存在类型:您正在使用的实际数据类型位于一个盒子内,当我们在该盒子上调用方法时,Swift 理解它应该隐式地在盒子内的数据上调用方法。...(numbers[0], numbers[1])) Swift 无法在静态验证(即在编译时)中确定这两个值是否可以使用 ==进行比较,因此代码根本无法构建。

    2.2K11

    C Sharp(一)

    (在写 Objective-C 或者 Swift 时,是没有命名空间的概念,所以官方给出的最佳实践是使用前缀的方式来区分不同类型。)...在语法上只需要一条语句,而一条语句无法表达时,就需要使用块 某些特定的程序结构只能使用块 虽然简单语句以号结尾,但块后面不跟分号(这样会多解析一条空语句) 字符串插值 新版 C# 可以使用字符串插值,类似...类型由下面元素定义: 名称 保存数据成员的结构 一些行为和约束 比如,int 类型: 名称: int 结构: 4 字节 行为: 32 位整数 实例化类型 从模板创建实际对象的过程,就称为实例化该类型...通过实例化类型创建的对象,可以称为对象,也可以称为实例 C# 中,每个数据项都是某种类型的实例 数据成员和函数成员 像 short,long 等这样的类型称为简单类型,只能存储一个数据项。...和 enum 类型是值类型,其他 4 种是引用类型 变量 C# 提供了 4 中变量: 本地变量 字段 参数 数组元素 变量在使用前必须声明。

    1.6K30

    Swift 5.1 中引入的部分有用的新特性

    Swift 5.1 - 简书 1、函数、闭包单表达式函数的隐式返回 现在,在声明仅包含单个表达式的函数和计算属性时,可以省略return关键字,这使得在声明更简单便捷的API时非常友好: //单行表达式...为了解决这个问题,我们在计算diff时也要调用inferringMoves方法,然后查看每个插入是否与移除关联,如果这样,则将其视为移动,如下所示: func update(with newModels...6、将协议抛出错误功能实现为非抛出 在Swift中,可以使用非抛出函数满足抛出错误函数协议的要求,这在某些情况下非常有用。...,但事实是,我们可以使用非抛出函数来实现抛出函数的要求,这使我们在遵守包含此类函数的协议时具有更高的灵活性。...中是无法编译通过的,因为swift不能把带有关联类型的协议类型作为返回类型,这个时候就轮到some上场了: func identityAnimal() -> some Animal { return

    1.4K20

    Swift基础 协议

    允许变量参数,但须遵守与正常方法相同的规则。然而,无法为协议定义中的方法参数指定默认值。 与类型属性要求一样,当在协议中定义static关键字时,您总是在类型方法要求前加上静态关键字。...random实例方法,该方法在调用时返回一个Double值。...您可以在许多允许其他类型的地方使用协议,包括: 作为函数、方法或初始化器中的参数类型或返回类型 作为常量、变量或属性的类型 作为数组、字典或其他容器中项目的类型 注意 由于协议是类型,因此以大写字母(如...此初始化器有一个名为generator的参数,该参数也属于RandomNumberGenerator类型。在初始化新的Dice实例时,您可以将任何符合类型的值传递给此参数。...Swift为没有原始值的枚举提供了Comparable的综合实现。如果枚举具有关联类型,它们都必须符合Comparable协议。

    15800

    窥探Swift之函数与闭包的应用实例

    (在Objc中默认可以在函数中改变形参的值) ? (2)给形参命名 为了代码的可读性和可维护性,我们在定义函数时,需要为每个参数名一个名字,这样调用者见名知意,很容易就知道这个参数代表什么意思了。...紧接着sum()函数的调用方式也会有所改变,在调用函数时编译器会给出参数的名称,这样调用者一目了然。...如果传入的是引用的话,在函数中对值进行修改的话,那么出了函数,这个被修改的值是可以被保留的。在Swift中也是可以的,不过你需要使用inout关键字修饰形参,并且在使用该函数时,用&来修饰。...紧接着是sayLove函数的三种不同的调用方式,在调用函数时你可以不传参数,可以传一个参数,当然传两个也是没问题的。 ?...4.数组中常用的闭包函数 在Swift的数组中自带了一些比较好用的闭包函数,例如Map, Filter, Reduce。接下来就好好的看一下这些闭包,用起来还是比较爽的。

    1.9K50

    Swift基础 可选链条

    来指定可选的链条在可选值之后,如果可选值为非nil在您希望调用属性、方法或下标的可选值之后。这与放置感叹号(!)非常相似在可选值之后,强制展开其值。...为了反映可选链可以在nil值上调用的事实,可选链调用的结果始终是可选值,即使您正在查询的属性、方法或下标返回非可选值。...该函数在返回值之前打印“函数已调用”,该值允许您查看是否计算了=运算符的右侧。...然而,没有返回类型的函数和方法具有隐式返回类型为Void,如《没有返回值的函数》中所述。这意味着它们返回一个值()或一个空元组。...具有可选返回值的方法链 前面的示例展示了如何通过可选链检索可选类型属性的值。您还可以使用可选链调用返回可选类型值的方法,并在需要时链上该方法的返回值。

    11900

    swift4.0语法杂记(精简版)

    swift中有规定,对象中的任何属性在创建对象时,都必须有明确的初始化值。 5、可选绑定 用if let/var表示。...可以定义swift的枚举类存储任意类型的关联值,而且每个枚举成员的关联值类型都可以不相同。...可以通过rawValue属性来访问枚举变量的原始值. let earthsOrder = Planet.earth.rawValue 4、枚举递归 枚举成员的关联值为当前枚举类型时称为递归枚举。...在swift中,用到了大量的结构体,比如说基本的数据类型都是结构体而不是类。这意味着它们被赋值给新的常量或者变量,或者被传入函数或方法中时,值会被拷贝。...在 Swift 4 中,做取子串操作的结果是一个 Substring 类型,它无法直接赋值给需要 String 类型的地方。

    15.4K90

    Why Swift? Generics(泛型), Collection(集合类型), POP(协议式编程), Memory Management(内存管理)

    Swift 的基本类型 String,Int,Double 和 Bool 等都是遵循 Hashable 的,还有无关联值的枚举也是的。...Hashable 协议同时也是遵守 Equatable 协议,通过实现 == 运算符来确定自定义的类或结构是否相同。 关联类型 在协议里定义的关联类型也可以用泛型来处理。...类型擦除 但是在使用关联类型的时候需要注意当声明一个使用了关联属性的协议作为属性时,比如下面的代码: class stateDelegate { var state: T var...意思是 HTNState 协议只能作为泛型约束来用,因为它里面包含必需的 self 或者关联类型。 那么该如何处理呢?这里需要通过类型擦除来解决,主要思路就是加个中间层在代码中让这个抽象的类型具体化。...实际上在 Swift 的标准库里就有类型擦除很好的运用,比如 AnySequence 的协议。 Where 语句 函数,扩展和关联类型都可以使用 where 语句。

    1.2K20

    万字长文|Swift语法全面解析|附示例

    Swift 通过采用现代编程模式来避免大量常见编程错误: 变量始终在使用前初始化。 检查数组索引超出范围的错误。 检查整数是否溢出。 可选值确保明确处理 nil 值。 内存被自动管理。...函数 函数的定义与调用,函数参数与返回值,函数参数标签和参数名称,函数类型,嵌套函数 可选元组返回类型。 定义一个输入输出参数时,在参数定义前加 inout 关键字。...枚举语法,使用 Switch 语句匹配枚举值,枚举成员的遍历,关联值,原始值(默认值),递归枚举(indirect) 可以定义 Swift 枚举来存储任意类型的关联值,每个枚举成员的关联值类型可以各不相同...willSet 在新的值被设置之前调用 didSet 在新的值被设置之后调用 属性包装器在管理属性如何存储和定义属性的代码之间添加了一个分隔层。 类型属性也是通过点运算符来访问。...表示与抛出错误,处理错误,指定清理操作 在 Swift 中,错误用遵循 Error 协议的类型的值来表示。 Swift 中有 4 种处理错误的方式。

    3.7K22

    Swift 周报 第四十三期

    通过使用隔离区域,语言可以证明在将非 Sendable 值传递过隔离边界后,该值(以及可能引用它的任何其他值)在调用者中不会被使用,从而防止竞争的发生。...讨论枚举案例类型签名/插值[7] 内容概括 讨论围绕获取具有关联值的枚举情况的字符串表示,特别是寻求一种为每种情况生成类型化签名或插值的方法。一个示例枚举了具有关联值及其预期输出签名的各种情况。...核心需求是为某些枚举案例的所有实例导出一个稳定的 hashValue,无论它们的关联值如何,旨在将具有相同案例名称但不同关联值的实例视为相同的存储目的。...最后,讨论暗示了从枚举案例数组中收集枚举时的挑战和注意事项,强调了编码和解码策略的复杂性以及在设计导出或序列化工具时深思熟虑的重要性。 讨论是否可以自动验证值更改并抛出错误?...文章首先介绍了 Swift 作为一种强类型、编译型、面向对象的编程语言的背景。 然后,详细讲解了函数和闭包的核心概念和联系,包括函数的定义、调用和返回值,以及闭包的定义、调用和返回值。

    22610

    Swift 周报 第四十三期

    通过使用隔离区域,语言可以证明在将非 Sendable 值传递过隔离边界后,该值(以及可能引用它的任何其他值)在调用者中不会被使用,从而防止竞争的发生。...讨论枚举案例类型签名/插值[7] 内容概括 讨论围绕获取具有关联值的枚举情况的字符串表示,特别是寻求一种为每种情况生成类型化签名或插值的方法。一个示例枚举了具有关联值及其预期输出签名的各种情况。...核心需求是为某些枚举案例的所有实例导出一个稳定的 hashValue,无论它们的关联值如何,旨在将具有相同案例名称但不同关联值的实例视为相同的存储目的。...最后,讨论暗示了从枚举案例数组中收集枚举时的挑战和注意事项,强调了编码和解码策略的复杂性以及在设计导出或序列化工具时深思熟虑的重要性。 讨论是否可以自动验证值更改并抛出错误?...文章首先介绍了 Swift 作为一种强类型、编译型、面向对象的编程语言的背景。 然后,详细讲解了函数和闭包的核心概念和联系,包括函数的定义、调用和返回值,以及闭包的定义、调用和返回值。

    23610

    Swift进阶七——面向对象编程

    关联值 我们可以定义Swift枚举来存储任意给定类型的关联值,不同的枚举成员关联值的类型是可以不同的。 ?...使用数组grid来存储矩阵中每个元素的值。 初始化的时候会传入函数和列数,并且每一个元素都会被初始化为0.0。 如上文描述,你可以在对应类型的实例上调用下标,此为实例下标。...如果不这样做,便捷初始化器赋予的新值都将被自己类中的其他指定初始化器所覆盖。 初始化器在第一阶段初始化完成之前,不能调用任何实例方法,不能读取任何实例属性的值,也不能引用self作为值。...两段式初始化过程 阶段一 指定或者便捷初始化器在类中被调用 为这个类的新实例分配内存。此时,内存还没有被初始化 这个类的指定初始化器确保所有由此类引入的存储属性都有一个值。...协议 协议是可以作为类型来使用的: 在函数、方法或者初始化器里面作为形式参数类型或者返回值类型 作为常量、变量或者属性的类型 作为数组、字典或者其他存储器的元素的类型 我们可以通过添加AnyObject

    98140

    Swift 5.1

    : 我们的函数决定具体的返回类型,而不是函数的调用方。...支持Static和class类下标(subscripts) 静态Static类型的属性和方法,可用来在类型所有实例间共享某些值。例如你可以在你的App中集中管理配置。..."Unknown") 字典包裹在类型中可以让更小心的控制它,并且使用没有case的enum,也就让你没法实例化Settings。 在Swift 5.1中你可以使用static subscript。...匹配可选(optional)和非可选的(non-optional)的enmu Swift一直能够在switch case聪明的处理可选(optional)和非可选的(non-optional)的string...:)来判断是删除的操作 这个功能确实非常的pro哈~~ 创建没有初始值的数组(uninitialized arrays) 可以在Swfift 5.1的版本中创建一个没有初始值的数组。

    63620

    【读书笔记】The Swift Programming Language (Swift 4.0.3)

    .非兼容类型的转换,由各个类自己的初始化方法实现....比 js 的 || 好使多了,因为前者能准确区分零值和nil值.只有nil值时,才需要使用默认值. * names[0..数组. ==> 本质上,应该是 array 的[]操作符...在调用 super.init 之前,不能调用任何实例方法,因为对象还没有效初始化. * 用 closure 指定默认值和属性的get/set 方法的区别在于 声明有个等号(=),说明前者是个赋值操作....类似. * 数组具体化类型声明为 Any / AnyObject 时,数组内可同时存放多种类型不兼容的实例....,如 AP&BP&CP. * protocol 可以在 extension 中定义自己的方法,任意遵循此协议的类型的实例都可以调用此协议自己的方法实现. --> 可以在 extension 实现协议规定的属性或方法的默认实现

    1.5K100

    使用 Swift 提高代码质量

    线程安全 值类型 - 更多使用值类型减少在多线程中遇到的数据竞争问题 async/await - 提供async函数使我们可以用结构化的方式编写并发操作。...避免基于闭包的异步方式带来的内存循环引用和无法抛出异常的问题 Actor - 提供Actor模型避免多线程开发中进行数据共享时发生的数据竞争问题,同时避免在使用锁时带来的死锁等问题 快速 值类型 - 相比...使用枚举关联值代替Any 例如使用枚举改造NSAttributedStringAPI,原有APIvalue为Any类型无法限制特定的类型。...在代码设计时可以优先考虑使用protocol来避免臃肿的父类同时更多使用值类型。 提示:一些无法用protocol替代继承的场景:1.需要继承NSObject子类。2.需要调用super方法。...4.需要在运行时动态转换一个实例的类型。 提示:不是所有struct都会保存在栈上,部分数据大的struct也会保存在堆上。 集合元素使用值类型 集合元素使用值类型。

    4.7K30

    Swift基础 集合类型

    数组是有序的值集合。集合是唯一值的无序集合。字典是键值关联的无序集合。 Swift 中的数组、集合和字典始终清楚可以存储的值和键的类型。这意味着您不能错误地将错误类型的值插入集合中。...您还可以将数组的类型以速记形式写为[Element]虽然这两种形式在功能上相同,但速记形式是首选,并在参考数组类型时在整个指南中使用。...Swift的Array类型还提供了一个初始化器,用于创建特定大小的数组,其所有值都设置为相同的默认值。...由于Swift的类型推断,如果您使用包含相同类型值的数组文字初始化数组,则不必编写数组的类型。...仅凭数组字面值无法推断集合类型,因此必须显式声明类型Set。但是,由于Swift的类型推断,如果您使用仅包含一种类型的值的数组文字初始化集元素的类型,则不必编写该集合元素的类型。

    11200
    领券