-
Swift混编1
-从预编译的角度理解Swift与Objective-C及混编机制目录 预编译知识指北 PCH(PreCompiled Header)是一把双刃剑 Clang Module 的来临! 头文件的搜索 互相调用总结 XCFramework内三个文件预编译知识指北#include 是对头文件的简单复制 #import 也是对头文件的复制,但保证不会重复粘贴 在预编译阶段会对#import引入的头文件进行替换(递归替换) 这种引入方式存在的问题:最主要的问...…
-
新项目去除storyboard
目录 介绍如何去除删除 Main.storyboard 文件 删除 info 下面的 Storyboard Name 条目 再删除下面的条目 代码创建窗口和根视图func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as?...…
-
Mirror反射
目录 什么是Mirror反射 有什么用什么是Mirror反射Swift 的反射机制是通过 Mirror 类型实现的。Mirror 提供了一种在运行时检查和操作对象结构的方式,允许你查看对象的类型、属性和值。虽然 Swift 是一种静态类型语言,但反射提供了一些动态特性,使你能够在运行时检查对象的详细信息。import Foundationclass Person { var name: String var age: Int init(name: String, ag...…
-
Swift是静态语言
目录 语言的静态特性 语言的动态特性 总结Swift 是一种静态语言,但它也包含了一些动态语言的特性。以下是对 Swift 静态性和动态性的详细解释语言的静态特性编译时类型检查Swift 是强类型语言,编译时会进行严格的类型检查,确保类型安全。静态方法分派大部分方法调用在编译时就已经确定,这有助于提高运行时性能。语言的动态特性运行时类型检查Swift 提供 Any 和 AnyObject 类型来表示任意类型的值,允许一些运行时类型检查。动态方法分派通过 @objc 和 NSObjec...…
-
22、单元测试
目录 单元测试单元测试swift unitTest(单元测试) Failed to import bridging header因为项目是通过OC和Swift混合开发的,所以说避免不了新建bridge-header文件,bridge-header文件主要作用就是让Swift文件可以访问到OC文件。同时,项目的第三方库我是用cocoapods进行管理的,在进行UnitTest的时候,编译报错,错误信息为“Failed to import bridging header”。出现这个问题的原因...…
-
21、响应式编程
目录 响应式编程 代码响应式编程一、响应式编程响应式编程(Reactive Programming,简称RP) 也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定 一般与函数式融合在一起,所以也会叫做:函数响应式编程(Functional Reactive Programming,简称FRP)比较著名的、成熟的响应式框架ReactiveCocoa 简称RAC,有Objective-C、Swift版本 官网: http://rea...…
-
20、面向协议编程
目录 面向协议编程 利用扩展添加前缀效果 利用协议添加前缀效果 利用协议实现类型判断面向协议编程一、面向协议面向协议编程(Protocol Oriented Programming,简称POP) 是Swift的一种编程范式, Apple于2015年WWDC提出 在Swift的标准库中,能见到大量POP的影子同时,Swift也是一门面向对象的编程语言(Object Oriented Programming,简称OOP) 在Swift开发中,OOP和POP是相辅相成的,任何一方并不能...…
-
19_02、函数式编程(二)
目录 函数式编程(一) 函数式编程(二) 高阶函数(Higher-Order Function) 函子(Functor) 单子(Monad)函数式编程(一)// 一、函数式编程func funtionalProgramming() -> Void { /** 函数式编程(Funtional Programming) 一、函数式编程(Funtional Programming,简称FP)是一种编程范式,也就是如何编写程序的方法论 ...…
-
19_01、函数式编程(一)
目录 Array的使用 lazy的优化 Optional的map和flatMap(一) Optional的map和flatMap(二) Optional的map和flatMap(三)Array的使用//一、Array的使用func arrayUse() -> Void { //1、 Array的常见操作 - map(映射) do{ print("------1-----") let intArr = [1,2,3,4]...…
-
18_03、OC到Swift(三)
目录 多线程开发 – 异步 多线程开发 – 加锁]多线程开发 – 加锁/** 多线程开发 – once dispatch_once在Swift中已被废弃, 取而代之 可以用 类型属性 或者 全局变量\常量(只初始化一次) 默认自带 lazy + dispatch_once 效果 *///全局常量,只初始化一次,只赋值一次,只在使用时才初始化(lazy)fileprivate let initTask2: Void = { print("initTask2---------")...…
-
18_02、OC到Swift(二)
目录 选择器的用法 string 的用法 可选协议 dynamic kvc kvo 关联对象(Associated Object) 资源名管理]选择器的用法//一、选择器的用法func selectorUse() -> Void { /** 选择器(Selector) n wift中依然可以使用选择器,使用#selector(name)定义一个选择器 必须是被@objcMembers或@objc修饰的方法才可以定义选择器 */ ...…
-
18_01、OC到Swift(一)
目录 mark标记 条件编译 系统版本检测 swift调用oc oc调用Swiftmark标记/// 一、mark标记func markUse() -> Void { //MARK: - test方法 //MARK: test1 //MARK: test1 //MARK: - 测试方法 //TODO:标记未完成任务 //FIXME:待修复问题 //警告 可用于标记未完成 #warning("undo") ...…
-
17_02、字面量、模式匹配(二)
目录 模式匹配 通配符模式 标识符模式 值绑定模式 元组模式 枚举Case模式 可选模式 类型转换模式 表达式模式 where模式匹配//一、模式匹配func patternUse() -> Void { /** 什么是模式? 模式是用于匹配的规则,比如switch的case、捕捉错误的catch、if\guard\while\for语句的条件等 Swift中的模式有 通配符模式(Wildcard Pattern) ...…
-
17_01、字面量、模式匹配(一)
目录 字面量 字面量协议 字面量协议应用字面量//一、字面量func literalUse() -> Void { //1、字面量 do{ print("--------1------") //代码中的10、false、"Jack"就是字面量 var age = 10 var isRed = false var name = "Jack" } //2、字面量 do...…
-
16、内存访问冲突、指针
目录 do的用法 内存访问冲突 指针的应用示例 获得指针 创建指针 交换指针类型do的用法//一、do的用法func doUse() -> Void { //局部作用域 do{ let a:Int = 10 let b:Int = 11 print(a,b) } //局部作用域 do{ let a:Int = 10 let b:Int = 11 pri...…
-
15_02、访问控制、内存管理(二)
目录 内存管理 逃逸闭包访问控制//一、内存管理func memoryManager(){ //一、引用问题 do{ print("----------1-------") /** 跟OC一样,Swift也是采取基于引用计数的ARC内存管理方案(针对堆空间) Swift的ARC中有3种引用: 1、强引用(strong reference):默认情况下,引用...…
-
15_01、访问控制、内存管理(一)
目录 访问控制 将方法赋值给let/var访问控制/** 模块:指的是独立的代码单元,框架或应用程序会作为一个独立的模块来构建和发布。在 Swift 中,一个模块可以使用 import 关键字导入另外一个模块 在访问权限控制这块,Swift提供了5个不同的访问级别(以下是从高到低排列, 实体指被访问级别修饰的内容) open:允许在定义实体的模块、其他模块中访问,允许其他模块进行继承、重写(open只能用在类、类成员上) public:允许在定义实体的模块、其他模块中访问,不允许其他模...…
-
14_2、可选项本质、运算符重载、扩展(二)
目录 comparable协议的使用 自定义运算符使用 extension的使用comparable协议的使用/// 一、comparable协议的使用struct Student : Comparable { /** score大的比较大,若score相等,age小的比较大 要想比较2个实例的大小,一般做法是: 遵守 Comparable 协议 重载相应的运算符 */ var age: Int var score: Int ...…
-
14_1、可选项本质、运算符重载、扩展(一)
目录 可选项的本质 多重可选项的本质 多重可选项的本质2 溢出运算符 重载运算符 Equatable的用法可选项的本质/// 一、可选项的本质func optionalNature() -> Void { //1、可选项的本质是enum do{ print("-------1----------") /** 可选项的本质是enum类型 public enum Optional<Wrapped&g...…
-
13、String、Array分析
目录 字符串分析 数组分析 补充内容字符串分析/// 一、字符串分析func stringAnaly(){ //1、长度小于等于15的字符串存储于str的内存中 do{ print("-------1-------") var str:String = "0123456789ABCDE" print(Mems.size(ofVal: &str)) //16 print(Mems.ptr(ofVal:...…