开发一个简单的swift 包-编程思维
swift 对于包包含了比较严格的访问控制,套路上与rust 比较类似,一般开发的项目都是自己项目的代码,以及引用别人开发 好的包,但是很多时候可能会有自己开发包共享别人的场景 简单包 可以直接使用swift 的cli 创建,或者手工 代码结构 ├── Package.swift └── Sources └── Platform └
morethink program
swift 对于包包含了比较严格的访问控制,套路上与rust 比较类似,一般开发的项目都是自己项目的代码,以及引用别人开发 好的包,但是很多时候可能会有自己开发包共享别人的场景 简单包 可以直接使用swift 的cli 创建,或者手工 代码结构 ├── Package.swift └── Sources └── Platform └
Combine简介 Combine是一个苹果用来处理事件的新的响应式框架,支持iOS 13及以上版本。 你可以使用Combine去统一和简化在处理类似于target-action,delegate,kvo等事情的代码。 iOS目前已经有第三方的响应式框架了,如:RxSwift、ReactiveCocoa,但是苹果现在发布了自己的新的框架。 它提供了一种声明式、函数式的编程方式,可以让开发者更加简
指针类型 //基本指针 UnsafePointer<T> const T * UnsafeMutablePointer T * //集合指针 UnsafeBufferPointer const T * //指向一个连续已知类型区域,可以看成一个集合,并支持集合操作 UnsafeMu
SwiftUI简介 SwiftUI是苹果推出的一个新的UI框架,它使用了声明的方式,通过视图,基础控件和布局控件来进行页面的开发。 SwiftUI具有跨平台性,一份SwiftUI代码可以同时跑在iOS、macOS、tvOS、watchOS平台上。 SwiftUI编写的页面代码更简洁,广泛使用链式调用。 SwiftUI视图和UIKit视图可以互相转换,对于将旧的项目过度到新布局方式比较友好。
函数的调用机制 函数的调用机制是在函数调用时通过那种路径走到最终调用函数地址的机制。 在编程语言中,函数的调用机制有三种 1.静态调用:编译期就确定了函数内存地址,执行效率最高,还可以使用编译器优化如:inline函数内联提升执行效率。缺点:因为函数调用的内存地址在编译期已经确定,则无法支持继承等动态修改调用的方式。 2.函数表调用:每个类都有一份自己的v-table虚函数表,里面是以函数名
String字符串常见用法 生成字符串 创建字符串 let greeting = "Hello, world!" let name = String("John") 连接字符串:使用加号(+)或者字符串插值(使用())来将多个字符串连接起来。 var firstName = "John" let lastName = "Doe" let fullName = firstName + " "
在iOS中有3种常见的定时器,它们会根据不同的场景进行选择使用。 1.DispatchSourceTimer: 基于GCD实现。 2.CADisplayLink:基于屏幕刷新实现。 3.Timer:基于RunLoop实现。 DispatchSourceTimer定时器 DispatchSourceTimer定时器可以通过DispatchSource.makeTimerSource(queue:
Swift下将网络返回json数据转换成struct 假如网络请求返回的数据结构是一个深层嵌套的Json 首先要通过key-value取出这个json中的数据源 // 将返回的json字符串转Dictory let json = """ { "name": "jack", "age": 20, "description": "A student." } """.dat
在block中常常会用到self,可是会造成循环引用。这时候就需要这样来解决这个问题: #define WeakSelf __weak typeof(self) weakSelf = self #define StrongSelf __strong typeof(weakSelf) self = weakSelf //OC - (void)aFunc:(id)sende
ObjC(Category of NSString): - (CGSize)getSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size{ CGSize resultSize = CGSizeZero; if (self.length <= 0) { return resultSize;
前者其实是NSObject都可以调用的KVC方法,后者才是NSUserDefaults的实例方法; 这里参数的类型是nullable id,但是我建议你在传null的时候慎重考虑,否则你的应用就可能面临闪退! 个人认为,任何高级语言里面使用null作为参数传递的时候,都应该万分小心! 前者其实是NSObject都可以调用的KVC方法,后者才是UserDefault
最常见的header就是在tableView下拉时header里的图片会放大的那种, 最近研究了一下,自己实现了这种header。 1.设置TableView的contentInset(为header预留空间)和contentOffset(使tableView加载完成后显示最顶部) tableView.contentInset = UIEdgeInsetsMake(he
使用typealias为常用数据类型起一个别名, 一方面更容易通过别名理解该类型的用途, 另一方面还可以减少日常开发的代码量。 typealias使用实例: // 网络请求常用回调闭包 typealias SuccessWithMsg = ((_ msg:String) -> Void) typealias FailWithError = ((Error) -> Vo
Xcode Playgound示例代码: let testView = UIView() testView.frame = CGRect.init(x: 100, y: 100, width: 200, height: 200) self.view.addSubview(testView) testView.backgroun