内容简介:书中 105 页的描述是:Swift 初始化方法必须保证所有非这个表述是不严谨的。Swift 初始化方法必须保证:
书中 105 页的描述是:Swift 初始化方法必须保证所有非 Optional
的成员变量都完成初始化。
这个表述是不严谨的。
Swift 初始化方法必须保证:
- 所有非 lazy /非 Optional 的可变 stored property
- 所有非 computed 不可变 stored property
都完成初始化。其中 stored property 的对义语是 computed property。
也就是说下列代码是不能被成功编译的,因为 bar
虽然是 Optional
的,但是确实一个不可变成员变量:
class Foo { let bar: String? init() { } } 复制代码
但是下列代码又是可以被成功编译的:
class Foo { let bar: String = { return "Bar" } init() { } } 复制代码
因为上述代码的 bar
是一个 computed property,而不是 stored property。
如果你觉得上述描述实在太难记,那么只需要记忆以下内容:Swift 会强制所有 不可变变量
以及 可变变量中非 optional 的
在变量生命周期的「产生」阶段都被初始化。这个「产生」阶段对于 class
和 struct
的 properties 而言就是 init
函数,对于全局变量和函数体内的本地变量而言就是变量声明的时候。
Swift 和 Objective-C 的自省描述有问题
书中 109 页:
... 这两个方法( [NSObject -isKindOfClass:]
和 [NSObject -isMemberOfClass:]
)的使用有一个前提,既 obj
必须是 NSObject
或其子类。
这个表述是有问题的, -isKindOfClass:
和 -isMemberOfClass:
是定义在 NSObject
这个 protocol 之中的,只要遵从 (conformed to) 了这个 protocol 那么你就可以使用这两个方法来进行自省,比如说 NSProxy
及其子类。
实际上 Objective-C runtime 也提供一组 API 来完成类似的功能,只是这组 API 中有些有可以不检查 class hierarchy。你如果构建过用来扩展 Objective-C 运行时的框架,那么你应该会很熟悉。
iOS 动画实现方式记录不完全
iOS 动画还包括 CADisplayLink
驱动的动画,比较有名的使用这个类来驱动动画的 iOS UI 组件就有 LTMorphingLabel
。另外有很多游戏或者三维程序也是用这个类来驱动的。
同时 UIScrollView
也是 iOS 上动画的重要来源,而且用这玩意儿做动画比较考验智力水平。基本上每年苹果都会在 WWDC 开专门的 sessions 讲如何使用 UIScrollView
及其子类。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 从一道 iOS 面试题到 Swift 对象模型和运行时细节——「iOS 面试之道」勘误
- 关于 RemoteViews 跨进程资源访问的勘误
- Asciinema 文章勘误及 Web 端使用介绍
- 深入理解Android Java虚拟机ART相关及勘误
- 【6月月报】新书加印与勘误,七大专栏齐上线,知识星球大改版!
- Python面试经验总结,面试一时爽,一直面试一直爽!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。