- 博客(61)
- 收藏
- 关注
原创 Jetpack Compose 中的副作用
函数是声明式的,它们会根据输入参数来描述 UI 的样子。这些函数可能会被多次调用,例如在状态发生变化时进行重组(Recomposition)。为了保证 UI 描述的一致性和可预测性,函数本身应该是无副作用的,也就是不会对外部状态产生影响。然而,在实际应用中,我们常常需要和外部世界进行交互,比如发起网络请求获取数据、启动和停止动画、注册和注销广播接收器等,这些操作都属于副作用。
2025-04-27 09:34:31
904
原创 Kotlin 属性初始化陷阱
然后执行 Derived 的 init 块,打印 "Derived class initialized: Derived class"。并且 Derived 的 value 尚未初始化(因为 Base 的初始化先于 Derived),此时 value 的值为 null。Derived 的 value 属性被初始化为 "Derived class"。在 Base 类的 init 块中,value 属性被访问。首选我们要确定一件事情,子类初始化,先会初始化父类。我们的疑问就是这个 null,为啥。
2025-04-18 15:17:30
282
原创 Flow 笔记
指的是流的数据是实时生成并广播给所有观察者的。如果程序里有一个可以被订阅的事件流,该事件流会在多个地方被订阅,同时这个事件流的生产流程非常消耗资源,需要在所有订阅都结束的时候,及时的结束 Flow 的生产,这种场景下就非常适合用。当下游的所有订阅全都结束之后,它会把上游的所有的生产过程也结束掉,而且这时候如果再来新的订阅,它就会重新启动上游的数据流。,当下游的所有订阅全都结束之后,它会把上游的所有的生产过程也结束掉,而且这时候如果再来新的订阅,它就会重新启动上游的数据流。
2025-04-17 14:07:21
713
原创 UIViewController如何设置背景色
UIViewController如何设置背景色?很多人会很快回答:self.view.backgroundColor = UIColor.whiteColor 非常正确,我是离开了公司才知道这样设置是正确的!跟我来看一个实际的项目,我接手这个项目的时候,这个项目已经快2年了,期间不知多少同事在完善这个代码。我们一个iOS小组大概有4个同事在同时维护这个项目。突然有一天UI设计找到我说这个...
2020-04-09 23:49:18
2205
原创 Swift 设计模式
设计模式可以归为一下3类:创建型(Creational):单例模式(Singeton)结构型(Structural):MVC、装饰器模式(Decorator)、适配器模式(Adapter)和外观模式(Facade)。行为型(Behavioral):观察者模式(Observer)、备忘录模式(Memento)...
2020-03-26 23:34:50
355
原创 Swift 面向协议编程
这些天看了陈刚的《Swift面向协议编程》一书,感觉作为一个Swift新人很值得一看,他里面应该讲了些WWDC2015和WWDC2016的东西,我把重点做了下笔记。数据结构:类、结构体、枚举属性运算符...
2020-01-17 15:53:46
248
原创 数据结构:类、结构体、枚举
引用类型传递的是对象的指针,这些指针保存在栈(Stack)上,栈中的对象系统会自动为我们管理(ARC),这样我们就不用自己去开辟和释放内存空间了,一旦没有指针指向对象,那么对象就会马上被清理掉,这种机制叫做自动引用计数(ARC)。这些对象存储在(Heap)堆中类(Class)是引用类型定义类使用class 关键字class newClass {// 创建了一个新类...
2020-01-17 15:52:09
516
原创 属性
属性将值跟特定的类,结构体或枚举关联。实例属性1.1 存储属性struct SomeStruct { let name = "小宝" //常量存储属性 var age = 6 //变量存储属性 var briday: String? //可选属性 lazy var add =...
2020-01-17 15:29:07
533
原创 语法糖(Syntactic sugar)
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。之所以叫「语法」糖,不只是因为加糖后的代码功能与加糖前保持一致,更重要的是,糖在不改变其所在位置的语...
2020-01-17 14:33:02
842
原创 Swift学习笔记 (四十四) 类型
Swift 语⾔存在两种类型:命名型类型和复合型类型。命名型类型是指定义时可以给定名字的类型。命名型类型包括类、 结构体、枚举和协议。比如,一个用户定义类MyClass的实例拥有类型MyClass。除了用户定义的命名型类型, Swift 标准库也定义了很多常用的命名型类型,包括那些表示数组、字典和可选值的类型。那些通常被其它语言认为是基本或原始的数据型类型,比如表示数字、字符和...
2019-09-03 11:57:36
233
原创 Swift学习笔记 (四十三) 词法结构
关键字和标点符号下⾯这些被保留的关键字不允许用作标识符,除非使用反引号转义,具体描述请参考《标识符》。除了inout、var以及 let之外的关键字可以用作某个函数声明或者函数调用当中的外部参数名,无需添加反引号转义。当一个成员与一个关键字具有相同的名称时,不需要使用反引号来转义对该成员的引用,除非在引用该成员和使用该关键字之间存在歧义 - 例如,self,Type和...
2019-09-02 13:54:43
318
原创 Swift学习笔记 (四十二) 不透明类型
具有不透明返回类型的函数或方法会隐藏返回值的类型信息。函数不再提供具体的类型作为返回类型,⽽是根据它支持的协议来描述返回值。在处理模块和调用代码之间的关系时,隐藏类型信息⾮常有用,因为返回的底层数据类型仍然可以保持私有。而且不同于返回协议类型,不透明类型能保证类型一致性 —— 编译器能获取到类型信息,同时模块使用者却不能获取到。不透明类型解决的问题举个例子,假设你正在写一个模...
2019-08-29 17:39:02
332
原创 Swift学习笔记 (四十一) 高级运算符(下)
优先级和结合性运算符的优先级使得一些运算符优先于其他运算符;它们会先被执行。结合性定义了相同优先级的运算符是如何结合的,也就是说,是与左边结合为一组,还是与右边结合为一组。可以将其理解为“它们是与左边的表达式结合的”,或者“它们是与右边的表达式结合的”。当考虑一个复合表达式的计算顺序时,运算符的优先级和结合性是非常重要的。举例来说,运算符优先级解释了为什么下面这个表达式的运算结...
2019-08-29 14:29:03
216
原创 Swift学习笔记 (四十) 高级运算符(上)
除了之前介绍过的《基本运算符》,Swift 还提供了数种可以对数值进⾏复杂运算的高级运算符。它们包含了在 C 和 Objective-C中已经被大家所熟知的位运算符和移位运算符。与 C 语言中的算术运算符不同,Swift 中的算术运算符默认是不会溢出的。所有溢出行为都会被捕获并报告为错误。如果想让系统允许溢出⾏为,可以选择使用 Swift 中另一套默认支持溢出的运算符,比如溢出加法运算...
2019-08-28 18:17:27
438
原创 Swift学习笔记 (三十九) 访问控制
访问控制可以限定其它源文件或模块中的代码对你的代码的访问级别。这个特性可以让我们隐藏代码的一些实现细节,并且可以为其他人可以访问和使用的代码提供接口。你可以明确地给单个类型(类、结构体、枚举)设置访问级别,也可以给这些类型的属性、方法、构造器、下标等设置访问级别。协议也可以被限定在一定的范围内使用,包括协议⾥的全局常量、变量和函数。Swift 不仅提供了多种不同的访问级别,还为某些...
2019-08-28 14:49:42
273
原创 Swift学习笔记 (三十八) 内存安全
默认情况下,Swift 会阻止你代码里不安全的行为。例如,Swift 会保证变量在使⽤之前就完成初始化,在内存被回收之后就无法被访问,并且数组的索引会做越界检查。Swift 也保证同时访问同一块内存时不会冲突,通过约束代码里对于存储地址的写操作,去获取那一块内存的访问独占权。因为Swift 自动管理内存,所以⼤部分时候你完全不需要考虑内存访问的事情。然而,理解潜在的冲突也是很重要的,可...
2019-08-27 15:17:25
186
原创 Swift学习笔记 (三十七) 自动引用计数(下)
⽆主引⽤和弱引用类似,无主引用不会牢牢保持住引用的实例。和弱引用不同的是,⽆主引用在其他实例有相同或者更长的⽣命周期时使⽤。你可以在声明属性或者变量时,在前面加上关键字unowned表示这是一个⽆主引用。⽆主引用通常都被期望拥有值。不过 ARC 无法在实例被销毁后将⽆主引用设为 nil,因为非可选类型的变量不允许被赋值为nil。重点使用无主引用,你必须确保引用始终指向...
2019-08-27 09:33:34
224
原创 Swift学习笔记 (三十六) 自动引用计数(上)
Java的垃圾回收:https://mp.weixin.qq.com/s/feJKRqYJTVEIxl6jvjevAg墙裂推荐阿里出品Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一直起作用,你无须⾃己来考虑内存的管理。ARC 会在类的实例不再被使用时,自动释放其占用的内存。然⽽在少数情况下,为了能帮助你管理内存,AR...
2019-08-26 11:17:43
177
原创 Swift学习笔记 (三十五) 泛型(下)
关联类型定义一个协议时,声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位符名称,其代表的实际类型在协议被遵循时才会被指定。关联类型通过associatedtype关键字来指定。关联类型实践下⾯例子定义了一个Container协议,该协议定义了一个关联类型Item:protocol Container { ...
2019-08-23 15:43:08
230
原创 Swift学习笔记 (三十四) 泛型(上)
泛型代码让你能根据自定义的需求,编写出适用于任意类型的、灵活可复用的函数及类型。你可避免编写重复的代码,⽽是用一种清晰抽象的方式来表达代码的意图。泛型是 Swift 最强大的特性之一,很多 Swift 标准库是基于泛型代码构建的。实际上,即使你没有意识到,你也一直在语言指南中使用泛型。例如,Swift 的Array和Dictionary都是泛型集合。你可以创建一个Int类型...
2019-08-22 16:36:42
223
原创 Swift学习笔记 (三十三) 协议(下)
检查协议一致性你可以使⽤《类型转换》中描述的is和as操作符来检查协议一致性,即是否符合某协议,并且可以转换到指定的协议类型。检查和转换协议的语法与检查和转换类型是完全一样的: 1. is用来检查实例是否符合某个协议,若符合则返回true,否则返回false; 2. as?返回一个可选值,当实例符合某个协议时,返回类型为协议类型的可选值,否则返回n...
2019-08-22 11:11:46
499
原创 Swift学习笔记 (三十二) 协议(中)
委托委托是一种设计模式,它允许类或结构体将一些需要它们负责的功能委托给其他类型的实例。委托模式的实现很简单:定义协议来封装那些需要被委托的功能,这样就能确保遵循协议的类型能提供这些功能。委托模式可以用来响应特定的动作,或者接收外部数据源提供的数据,⽽无需关心外部数据源的类型。下⾯的例子定义了两个基于骰子游戏的协议:protocol DiceGame { var dic...
2019-08-21 15:22:39
182
原创 Swift学习笔记 (三十一) 协议(上)
协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法、属性,以及其他需要的东西。类、结构体或枚举都可以遵循协议,并为协议定义的这些要求提供具体实现。某个类型能够满足某个协议的要求,就可以说该类型遵循这个协议。除了遵循协议的类型必须实现的要求外,还可以对协议进⾏扩展,通过扩展来实现一部分要求或者实现一些附加功能,这样遵循协议的类型就能够使用这些功能。协议语法协议的定...
2019-08-20 17:35:56
253
原创 Swift学习笔记 (三十) 扩展
扩展可以给一个现有的类,结构体,枚举,还有协议添加新的功能。它还拥有不需要访问被扩展类型源代码就能完成扩展的能⼒(即逆向建模)。扩展和 Objective-C 的分类很相似。(与 Objective-C 分类不同的是,Swift 扩展是没有名字的。)Swift 中的扩展可以: 1.添加计算型实例属性和计算型类属性 2.定义实例方法和类方法 3.提供新的构造...
2019-08-20 13:59:54
230
原创 Swift学习笔记 (二十九) 嵌套类型
枚举常被用于为特定类或结构体实现某些功能。类似地,枚举可以方便的定义工具类或结构体,从而为某个复杂的类型所使用。为了实现这种功能,Swift 允许你定义嵌套类型,可以在支持的类型中定义嵌套的枚举、类和结构体。要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的{}内,而且可以根据需要定义多级嵌套。嵌套类型实践下⾯这个例子定义了一个结构体BlackjackCar...
2019-08-19 17:27:50
230
原创 Swift学习笔记 (二十八) 类型转换
类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。类型转换在 Swift 中使用is和as操作符实现。这两个操作符分别提供了一种简单达意的方式去检查值的类型或转换它的类型。你也可以⽤它来检查一个类型是否遵循了某个协议,就像在《检验协议遵循》部分讲述的一样。为类型转换定义类层次你可以将类型转换用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类...
2019-08-19 15:39:41
243
原创 Swift学习笔记 (二十七) 错误处理
错误处理(Error handling) 是响应错误以及从错误中恢复的过程。Swift 在运⾏时提供了抛出、捕获、传递和操作可恢复错误(recoverable errors)的一等支持(first-class support)。某些操作无法保证总是执行完所有代码或生成有用的结果。可选类型用来表示值缺失,但是当某个操作失败时,理解造成失败的原因有助于你的代码作出相应的应对。举个例子,...
2019-08-19 13:20:03
277
原创 Swift学习笔记 (二十六) 可选链式调用
可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会成功;如果可选值是nil,那么调用将返回nil。多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil。注意Swift 的可选链式调用和 Objective-C 中向nil发送消息有些相像,但是...
2019-08-16 16:19:52
199
原创 Swift学习笔记 (二十五) 析构过程
析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器⽤关键字deinit来标示,类似于构造器要用init来标示。析构过程原理Swift 会自动释放不再需要的实例以释放资源。如《自动引用计数》章节中所讲述,Swift 通过自动引用计数(ARC) 处理理实例的内存管理。通常当你的实例被释放时不需要手动地去清理。但是,当使用自己的资源时,你可能需要进⾏...
2019-08-15 16:11:45
179
原创 Swift学习笔记 (二十四) 构造过程(下)
指定构造器和便利构造器实践接下来的例子将在实践中展示指定构造器、便利构造器以及构造器的自动继承。这个例子定义了包含三个类 Food、RecipeIngredient以及ShoppingListItem的层级结构,并将演示它们的构造器是如何相互作用的。类层次中的基类是Food,它是一个简单的用来封装⻝物名字的类。Food类引⼊了一个叫做name的String类型...
2019-08-15 14:40:06
230
原创 Swift学习笔记 (二十三) 构造过程(上)
构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例使用前有个过程是必须的,它包括设置实例中每个存储属性的初始值和执⾏其他必须的设置或构造过程。你要通过定义构造器来实现构造过程,它就像用来创建特定类型新实例的特殊方法。与 Objective-C 中的构造器不同, Swift 的构造器没有返回值。它们的主要任务是保证某种类型的新实例在第一次使用前完成正确的初始化。类的实例...
2019-08-14 11:31:50
190
原创 Swift学习笔记 (二十二) 继承
一个类可以继承另一个类的⽅法,属性和其它特性。当一个类继承其它类时,继承类叫子类,被继承类叫超类(或父类)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。在 Swift 中,子类可以调用和访问超类的方法、属性和下标,并且可以重写这些方法,属性和下标来优化或修改它们的⾏为。Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写⾏为是正确的。可以为类中...
2019-08-12 17:58:54
308
原创 Swift学习笔记 (二十一) 下标
下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。举例来说,⽤下标访问一个Array实例中的元素可以写作someArray[index],访问Dictionary实例中的元素可以写作someDictionary[key]。 一个类型可以定义多个下标,通过不同索引类型进⾏重载。下标不限于一...
2019-08-12 14:17:34
210
原创 Swift学习笔记 (二十) 方法
⽅法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objective-C 中的类方法 (classmethods)相似。结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。在 Objective-C 中,类是唯...
2019-08-09 18:11:47
165
原创 Swift学习笔记 (十九) 属性
属性将值与特定的类、结构体或枚举关联。存储属性会将常量和变量存储为实例的一部分,⽽计算属性则是直接计算(而不是存储)值。计算属性可以用于类、结构体和枚举,⽽存储属性只能用于类和结构体。存储属性和计算属性通常与特定类型的实例关联。但是,属性也可以直接与类型本身关联,这种属性称为类型属性。另外,还可以定义属性观察器来监控属性值的变化,以此来触发自定义的操作。属性观察器可以添加到类本身定义的...
2019-08-09 14:20:45
182
原创 Swift学习笔记 (十八) 结构体和类
结构体和类作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常量、变量和函数的语法,为你的结构体和类定义属性、添加方法。与其他编程语⾔所不同的是,Swift 并不要求你为自定义的结构体和类的接口与实现代码分别创建文件。你只需在单一的文件中定义一个结构体或者类,系统将会自动生成面向其它代码的外部接口。注意通常一个类的实例被称为对象。然而相比其他语言,Swif...
2019-08-08 14:50:24
287
原创 Swift学习笔记 (十七) 枚举
枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。此外,枚举成员可以指定任意类型的关联值存储到枚举成员中,就...
2019-08-07 17:55:52
507
原创 Swift学习笔记 (十六) 闭包
闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数(Lambdas)⽐较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。注意如果你不熟悉捕获(capturing)这个概念也...
2019-08-06 18:16:35
425
原创 IOS工程Build自增+1
1.首先我们要建立一个 脚本 Run Script (选中Target–>Build Phases –> +)2.点击后会生成一个空的Run Script3.把下面的代码贴到输入台中,代码我就不解释了# Type a script or drag a script file from your workspace to insert its path...
2019-08-06 13:35:27
819
原创 Swift学习笔记 (十五) 函数(下)
忽略参数标签如果你不希望为某个参数添加一个标签,可以使⽤一个下划线(_)来代替⼀个明确的参数标签。funcsomeFunction(_firstParameterName:Int,secondParameterName:Int) {//在函数体内,firstParameterName和secondParameterName代表参数中的第一个和第二个参数值}...
2019-08-05 14:38:30
143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人