Hello, Harmony

本文旨在帮助 iOS 开发者快速入门鸿蒙开发的基本概念,了解鸿蒙与 iOS 系统下名词的对应关系,以便顺利转方向。 系统层面 鸿蒙 相当于 iOS 备注 Ability   UIKit - UISceneSession 或者 SwiftUI - Scene 多个 Ability 在系统中表现为多个应用实例,可以在任务管理器中切换、关闭, »

Swift lazy 属性的本质

我们经常出于性能的考虑,会在 Swift 开发中使用 lazy 属性或变量,它是一个语法糖,帮助我们只在必要时(初次访问)才完成初始化,构造出实例。 比如: class MyExpensiveObject { // ... func foo() { } } class ViewController: UIViewController { lazy var object = MyExpensiveObject() override viewDidLoad() { super. »

Swift 的可选值优化

在 Objective-C 中,nil 表示空对象,它本质是一个指向 0x00000000 的指针。但对于非指针的值类型,OC 中是无法表示没有值这个概念的,比如 NSInteger,它可以是 0,也可以是其他任何值,但就是不存在没有值。 Swift 作为一种强类型的语言,它从一开始就引入了没有值这个概念,虽然还是用 nil 关键字,但实际语义上有所不同。比如 Int? »

Swift编译器之迷惑行为二

在 App 工程中通过 Cocoapods 引入一个自己的 Swift 业务库 Pod1,该库中有一个 Swift 类服从一个 OC 的协议并实现了部分方法,例如: open class AppDelegate : NSObject, UIApplicationDelegate { open func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: »

Swift编译器之迷惑行为一

OptionSet 是 Swift 中比较常用的一个内置协议,它的存在算是填补了既要强类型,又要支持按位取与的空白,是对 OC 中 NS_OPTIONS 的桥接。从声明上可以看到,OptionSet 协议本身又服从 SetAlgebra 协议,后者只定义了常见的集合操作方法,如 union remove insert 等,而前者在 extension 中给了默认实现: »

UIVisualEffectView 背后的实现

iOS 8 苹果为我们带来了原生的毛玻璃效果的支持,即 UIVisualEffectView。 UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]]; 但它提供的 API 非常有限,能改的样式属性只有两个 effect 以及不多的几个 style,模糊效果也基本是非黑即白,模糊程度也不可调节。但有时候不关心实现的设计师们会要求某些地方模糊小一点之类的,此时一般就换自己用高斯模糊来做了,这里问题就来了,真的做不了吗? »

CALayer 的 filters

CALayer 上有一个属性,一直以来大家都容易忽视,即:filters。而苹果官方文档上只给了 CIFilter 的示例,但事实上 CIFilter 设置进去后并没有效果,同时下方也指明了在 iOS 上不支持。(这里是 CIFilter 的完整列表) @interface CALayer : NSObject <NSSecureCoding, CAMediaTiming> /* An array »

UIView 显示调试边界

作为 iOS 开发者,我一直羡慕 Android 强大的开发者选项,如显示视图边界等。 而这一简单的功能,直到最近几个版本的 Xcode 才支持。真机调试运行起来后,点击 Debug -> View Debugging -> Show View Frames 效果如下图: 然而,只能在真机连接到 Xcode 时才能开启, »