Swift
文章平均质量分 57
yokan_de_s
这个作者很懒,什么都没留下…
展开
-
Swift源码简单解读 - == 与 ??
====的定义地方有很多,也不能所有地方都进行解读,解读几个常见的吧==在array中的定义@inlinable public static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool { let lhsCount = lhs.count if lhsCount != rhs.count { return false } // Test ref原创 2021-09-28 16:37:24 · 160 阅读 · 0 评论 -
Swift源码简单解读-Map与FlatMap
Swiftswift源码里面这四个是经常看的,原创 2021-09-26 16:47:31 · 360 阅读 · 0 评论 -
RxSwift 响应式编程
响应式编程已经出了很完整的框架了比如ReactiveCocoa 简称RAC,前段时间有个项目是这个框架(感觉贼鸡儿晦涩难懂,完全把编程思路要整个转换,如果之前不是用这个编程范式),ReactiveCocoa是专门针对的OC Swift,换句话说暂时来说是适配苹果各平台开发(iOS,Mac)再比如ReactiveX,这个这个版本支持的语言就更多了,也不是很重要,就不细较了,唯一值得在意的是RXSwiftuse_frameworks!target 'UItest' do pod 'RxSwi原创 2021-09-18 15:12:25 · 410 阅读 · 0 评论 -
面向协议编程
面向对象 OOP 面向协议POP是Swift的一种编程范式,官方API和一些第三方库用的挺多的,即使不用这种范式,也有了解的必要面向协议编程比OC的协议要更加强大,除了使用组件开发的时候遵循某些方法外,还可以给某些有共同但...原创 2021-09-17 12:30:21 · 180 阅读 · 0 评论 -
Swift 判断字符串有多少汉字
let str = "abc积分换地方叫对方吧由11234"func hanziCount(str: String) -> Int { var count = 0 for index in str.indices { if ("\u{4E00}" <= str[index] && str[index] <= "\u{9FA5}") { count += 1 } } return c.原创 2021-09-15 14:10:49 · 357 阅读 · 0 评论 -
Swift - 函数式编程
函数式编程并不是一门技术,严格来说算是一种代码规范,函数式编程的核心就是把代码的可复用性提高,减少代码量(我个人觉得没必要复用性太严重,否则会出A CALL B B CALL C,然后C里面又CALL了N个函数,这N个函数在N个类里面还有重名,可读性基本没有,适当的降低代码量即可)...原创 2021-09-14 16:25:52 · 111 阅读 · 0 评论 -
集合-高阶函数
数组数组本身的增删改查就不赘述var arr = [1,2,3,4]arr.append(5) //在最后面插入arr.popLast() //弹出最后一个元素arr.insert(6, at: 3) //插入arr.remove(at: 1) // 删print(arr.index(after: 1)) //查map原创 2021-06-15 17:27:38 · 95 阅读 · 0 评论 -
多线程- 1 基本用法
基本用法多线程的最常见的目的就是1.把耗时的计算操作放到子线程2.通知主线程渲染UI区别只在于是串行队列和并行队列,比如原创 2021-06-08 18:40:52 · 80 阅读 · 0 评论 -
类拓展添加一个存储属性
在OC里面分类也是无法添加一个属性的,可以调用set 和get方法,但实际的值是无法存储的,解决的办法就是添加关联对象在Swift里面拓展就相当于OC的分类,本身也是m原创 2021-05-29 16:44:59 · 73 阅读 · 0 评论 -
OC和Swift混编 补充
可以看到只有8个字节了,里面是一个指针,学过OC的应该知道这就是isa指针,指向的是类对象地址,然后里面有superClass指定和isa里面的isa指向元类对象,这都是OC的内容了就不赘述了原创 2021-05-28 18:07:14 · 120 阅读 · 0 评论 -
字符串处理
String和NSString是两个东西,前者是结构体,后者是对象,如果可以尽量使用结构体var str = ""var原创 2021-05-28 17:53:52 · 88 阅读 · 0 评论 -
Swift和OC混编 3 - 函数调用原理
暴露给OC使用的Swift类必须继承NSObject的原因就是,OC使用的时候是必须要用alloc,objc_msgSend等OC的runtime机制,那如果不继承NSObject,基本的初始化过程都没法完成OC写的类如果丢给Swift使用,创建一个OC类Person.h@interface Person : NSObject-(void)go;@endPerson.m#import "Person.h"#import "test-Swift.h"@implementatio原创 2021-05-28 15:49:38 · 574 阅读 · 1 评论 -
Swift和OC混编 - 2 选择器
swift本身也是可以使用选择器的,并不需要通过桥接的方式使用选择器,但是使用的话必须要是@objc或者@objcMembers修饰的方法才能定义选择器关键字是#selector假如我直接写一个#selector(go)其中go是函数,会报错Argument of '#selector' refers to instance method 'go()' that is not exposed to Objective-Cclass Person :NSObject { var nam.原创 2021-05-22 20:36:33 · 197 阅读 · 0 评论 -
Swift和OC混编-1
现在的框架还是OC的比较多,虽然大部分都支持了Swift一旦遇到只支持OC的,还是需要用Swift调用OC,相反如果遇到一个OC的老模块不能使用了,那么编写一个新的Swift模块,也同时需要OC调用SwiftSwift调用OC在Swift项目里面创建OC会提示需不需要生成桥接文件,一般是默认生成会多一个targetname-Bridging-Header.h这样的一个桥接文件*****如果不小心点到了Don‘t Create也没事(正常情况是默认生成不用手动去弄)1.创建一个he原创 2021-05-21 19:15:23 · 443 阅读 · 5 评论 -
iOS的程序入口
oc的程序入口是main.m文件这一块,但swift是没有的swift只有一个@main的标记,其实这就是程序入口了如果想重写这个入口1.注释掉@main,变成//@main或者也可以直接删了2.创建一个main.swift文件3.在main.swift写如下代码import UIKitclass MyApplication:UIApplication{}UIApplicationMain(CommandLine.argc, CommandLine.unsafeA.原创 2021-05-21 16:42:30 · 739 阅读 · 0 评论 -
条件编译
#if os(macOS)print("abc")#else#endif比如这样就只会在macOS系统下面才会执行abc,我这电脑是mac所以能执行,换成iOS就不行了,还有诸如#if os(iOS)print("abc")#elseif swift(>=3)print("123")#else#endif还有最常见的#if DEBUGprint("debug")#elseprint("release")#endif在debug下面执行的代码可能和rel.原创 2021-05-20 18:59:22 · 165 阅读 · 0 评论 -
注释
首先单行注释依然是// 多行也依然是/* *///MARK: - 纯注释func test() { // TODO: 今天没时间做了,明天继续(用在规划第二天的任务,或者模块开发先定义函数,但是并没有为函数进行实际的填充)}func fix(){ // FIXME: 小问题有时间再来修复下(比如急着上版本但还有一个像素的bug来不及修复了,实际上架了也不影响)}上述注释在编译器里面会显示出来,相较于之前的注释,这个不适合逐行注释,否则找不到想要的内容了...原创 2021-05-20 18:37:01 · 41 阅读 · 0 评论 -
模式匹配
通配符模式通配符就是 _ 可以匹配任何值,_?匹配非nilenum Life { case human(name:String,age:Int?) case animal(name:String,age:Int?)}let l1 = Life.human(name: "人", age: 10)let l2 = Life.human(name: "人1", age: nil)let l3 = Life.animal(name: "猫", age: 3)let l4 = Li原创 2021-05-20 18:29:08 · 90 阅读 · 0 评论 -
字面量
字面量var str = "123"var num = 123var isRealy = true左边的是变量,右边的"123",123,true这些值,就是字面量,字面量有默认类型,但可以通过设置别名比如这个num就是默认的Int类型public typealias IntegerLiteralType = Int8var str = "123"var num = 123var isRealy = true加上IntegerLiteralType的别称之后n原创 2021-05-16 19:56:23 · 340 阅读 · 0 评论 -
指针
四种指针类型@frozen struct UnsafePointer<Pointee> 相当于const Pointee *(常量指针,顾名思义无法修改)其中Pointee是个泛型,他可以指代类型,比如UnsafePointer<Int>就是 const Int *@frozen struct UnsafeMutablePointer<Pointee> 相当于 Pointee * 就是普通指针,能修改的@frozen struct UnsafeR...原创 2021-05-14 19:08:46 · 122 阅读 · 0 评论 -
内存访问冲突
Simultaneous accesses to 0x10000c1f0, but modification requires exclusive access.这段错误信息就是访问冲突,代码如下var val = 10func plus(iVal:inout Int) { iVal += val}plus(iVal: &val)print(val)在一行同时访问了val 两次,一次是iVal只是个形参,实际两个值都是val***注意点,几乎所有的冲突都是必须至少要原创 2021-05-12 17:52:56 · 1117 阅读 · 0 评论 -
do
do{ var a = 10}do{ var a = 20}do-catch是异常捕获,但do也有单独一个程序段的作用,OC里面{}就表示一个程序段,但Swift要do{}原创 2021-05-11 19:57:05 · 75 阅读 · 0 评论 -
逃逸闭包和非逃逸闭包
typealias OnetoZero = (Int) -> ()func test(_ fn:OnetoZero){ fn(10)}test { (val:Int) in print("传入参数是:",val) }如果只有一个闭包参数,则可以省略括号,直接写闭包,这个闭包的写法是 {(参数)in 函数体}所以这就是一个闭包,而且属于非逃逸闭包,因为fn就在函数体内执行了typealias OnetoZero = (Int) -> ()func test(_ ..原创 2021-05-11 19:55:09 · 302 阅读 · 0 评论 -
内存管理
Swift也是基于引用计数的ARC内存管理(堆空间),栈空间离开就释放默认三种引用,强引用,弱引用,无主引用强引用(默认)有引用计数,在ARC里面强引用销毁了,堆地址一般就销毁了,除非引用计数不为0,比如还有其它的强引用弱引用(weak) 不产生引用计数,自身被销毁了ARC也不会管堆内存是否已经被销毁,但堆内存被销毁的话,同时也会销毁这个引用指针无主引用(unowned)内存被销毁了依然会指向那块内存,如果没有值,或者是错误的值会直接抛出异常,基本只有确定不会销毁才用循环引用循环..原创 2021-05-11 19:45:54 · 51 阅读 · 0 评论 -
方法与函数在赋值成var/let 后的区别
方法是类,结构体或者枚举内部的函数,本质上是一个东西,但在赋值给var let的时候也还是有区别的func add(_ a:Int,_ b:Int) -> Int{ a + b}let fn = addprint(fn(2,3)) //5print(fn(3,5)) //8struct Person{ var a:Int func go() { print("go\(a)") }}let fn1 = Pers原创 2021-05-11 18:21:56 · 61 阅读 · 0 评论 -
封装权限(访问控制) - 补充
setter和getter的权限问题getter本身权限是不能比setter低的class Person{ private(set) var val = "123" private(set) var str:String { set { print(newValue) } get { return "get" } }}var p = Person()p.val = "456"print(p.val)p.str = "123原创 2021-05-09 17:47:50 · 130 阅读 · 0 评论 -
封装权限(访问控制)
1.open 这是权限最大的,只要用它来修饰的变量(类),整个项目都能访问,并且支持所有编译器允许的操作,不过只有类可以用这个来修饰变量,结构体会报下图的错误,拿第三方库比喻的话,就是封装在最外层的类2.public 允许本模块的所有操作,不允许被其它模块继承和重写,基本是最常用的权限3.internal 在public的基础上,只允许本模块访问4.fileprivate只允许在当前的文件内访问比如main.m里面用fileprivate定义了一个类,那就只能main.m文件的其它类或者什么能.原创 2021-05-08 18:57:43 · 425 阅读 · 0 评论 -
CustomDebugStringConvertible和CustomStringConvertible的区别,self和Self的区别
struct Dircetion :CustomDebugStringConvertible ,CustomStringConvertible{ var x:Double = 0 var y:Double = 0 static let offset_x:Double = 0.001 var description: String { get{ String(format:"x:\(self.x),y:\(self.y)") .原创 2021-05-07 18:05:28 · 182 阅读 · 0 评论 -
特殊运算符以及运算符的重载
溢出运算符目前的溢出运算符有三种&+ &- &*var num:Int8 = 127print(Int8.max) //127print(Int8.min) //-128num += 1print(num) //抛出异常正常做运算如果溢出就会报错,比如上述代码,Int8支持的最大数字是127,再加1就溢出了,系统会抛出异常,解决办法就是用溢出运算符&+var num:Int8 = 127print(Int8.max) //127pri原创 2021-05-06 19:22:27 · 207 阅读 · 0 评论 -
可选项本质
var num:Optional<Int> = nilvar num1:Int? = nilnum? += 2num1? += 3其实这两个变量num和num1本质是一样的,都是Int类型的可选项然后点进Optional官方也是提供的这两种方式,只是它解释用的转换符,因为字符串转换Int并不一定成功,所以会返回一个可选项 ,再看声明是一个泛型枚举枚举有两个case,一个some一个noneenum Optional <Wrapped> { .原创 2021-05-04 16:53:16 · 88 阅读 · 0 评论 -
字符串基本内存结构
字符串是占16个字节的,一个字符是占一个字节的,所以问题就是超过16个字节的字符怎么存储字符串内容小于16个字节,拿字符说,小于等于16个字符,就放变量内存大于16个字节放Text段的cString(常量区),字符串的内存布局为字符串长度+字符串地址指针(并不是实际指针,需要进行运算)如果是用append等方式拼接的字符串超过16个字节,就会开启堆空间,本地为字符串长度+堆空间地址指针,堆空间是类型信息(元类信息)+引用计数+实际内容,所以指针指向的内容也不是字符串,还要偏移...原创 2021-04-30 17:41:11 · 3746 阅读 · 1 评论 -
关联类型
基础关联类型类型约束注意点(类型约束)不透明类型 some可选项的本质原创 2021-04-29 19:28:51 · 192 阅读 · 0 评论 -
泛型
泛型的主要目的1.提高利用率2.减少代码量基本的泛型函数var a = 1,b = 5//func exchange<T>(_ a:inout T,_ b :inout T) {func exchange<ALL>(_ a:inout ALL,_ b :inout ALL) { ( a , b ) = ( b , a )}exchange(&a, &b)print("a:\(a),b:\(b)") //a:5,b:1var s1 =原创 2021-04-28 16:54:15 · 48 阅读 · 0 评论 -
异常处理
语法错误:就平时写程序的时候会报的错误,在编译之前就得处理掉逻辑错误:代码写错了,比如加写成-了运行时错误程序员日常解决最多的错误应该就是运行时错误了,跑着跑着不知道为毛挂了,然后就开始打断点做各种调试func divide(dividend:Int,divisor:Int) -> Int { return dividend / divisor}print(divide(dividend: 20, divisor: 0))在非自定义错误的情况下可以做如下处理f.原创 2021-04-27 17:42:24 · 105 阅读 · 1 评论 -
各个关键字的区别
Any,AnyObjectis as? as! asX.self X.type AnyClass原创 2021-04-24 16:33:36 · 100 阅读 · 0 评论 -
Swift - 协议
协议中的属性static,classmutatinginit init? init!协议的继承协议组合CaseIterableCustomStringConvertible原创 2021-04-22 20:25:39 · 102 阅读 · 0 评论 -
可选链
可选链注意点原创 2021-04-22 16:32:45 · 207 阅读 · 0 评论 -
Swift - 初始化器补充和反初始化器
required属性初始化器在子类和父类中的区别可失败的初始化器反初始化器可选链原创 2021-04-21 16:23:43 · 96 阅读 · 0 评论 -
Swift-初始化器
便捷初始化普通的初始化在类与结构体已经记录过了,这里就说说便捷初始化器,以及两者的区别便捷初始化器的用处初始化器和便捷初始化器在继承里面的使用初始化器之间的相互调用规则初始化器链两段初始化安全检查重写初始化器...原创 2021-04-20 18:46:41 · 274 阅读 · 1 评论 -
继承
//继承也单独写继承的内存结构重写多态重写类型方法和下标重写属性子类给父类添加属性观察器final原创 2021-04-15 16:59:24 · 124 阅读 · 0 评论