swift
swift学习
HelloWlrold
这个作者很懒,什么都没留下…
展开
-
二十三、面向协议编程
/*1.面向协议编程面向协议编程Protocol Oriented Programming,POP是swift的一种编程范式,Apple于2015年WWDC提出,在swift的标准库中,能见到大量POP的影子。同时,swift也是一门面向对象的编程语言Object Oriented Programming,OOP,在swift开发中,OOP和POP是相辅相成的,任何一方并不能取代另一方,POP能弥补OOP设计上的不足.2.回顾OOPOOP的三大特性:封装、继承、多态。继承的经典使用场合:...原创 2020-10-16 10:24:02 · 251 阅读 · 0 评论 -
二十二、函数式编程
//1.Array的常见操作var arr = [1, 2, 3, 4]var arr2 = arr.map { //map映射// i in// return 2 * i $0 * 2 // $0数组元素}print(arr2) //[2, 4, 6, 8]var arr6 = arr.map { "abc_\($0)" } //$0数组元素print(arr6) //["abc_1", "abc_2", "abc_3", "abc_4"]var arr3 = a...原创 2020-10-16 10:24:38 · 138 阅读 · 0 评论 -
二十一、从OC到swift
//1.MARK、TODO、FIXME //MARK: 类似于OC的#pragma mark //MARK: - 类似于OC的#pragma mark - //TODO: 用于标记未完成的任务 //FIXME: 用于标记待修复的问题 class Person1 {} func test() -> Person1{ //TODO: 未完成 //或者...原创 2020-10-16 10:24:21 · 153 阅读 · 0 评论 -
二十、字面量
//1.字面量,10,false,"Jack"都是字面量//swift自带的绝大部分类型,都支持直接通过字面量进行初始化:Bool,Int,Float,Double,String,Array,Dictionary,Set,Optional等var age = 10var isRed = falsevar name = "Jack"//常见字面量的默认类型//public typealias IntegerLiteralType = Int//public typealias FloatLite原创 2020-10-15 00:05:16 · 107 阅读 · 0 评论 -
二十四、响应式编程
import UIKitimport RxSwiftimport RxCocoa//7.拓展Binder属性extension Reactive where Base: UIView { var hidden: Binder<Bool> { return Binder<Bool>(base) { button, value in button.isHidden = value } } }c...原创 2020-10-16 10:24:47 · 230 阅读 · 0 评论 -
十九、内存管理
/*1.内存管理跟OC一样,swift也是采取基于引用计数的ARC内存管理方案(针对堆空间)swift的ARC中有3种引用:a.强引用:默认情况下,引用都是强引用b.弱引用:通过weak定义弱引用,必须是可选类型的var,因为示例销毁后,ARC会自动将弱引用设置为nil,ARC自动给弱引用设置为nil时,不会触发属性观察器c.无主引用,通过unowned定义无主引用。不会产生强引用,实例销毁后仍然存储着实例的内存地址(类似OC中的unsafe_unretained)试图在实例...原创 2020-10-15 00:05:03 · 105 阅读 · 0 评论 -
十八、访问控制
/*1.访问控制在访问权限控制这一块,swift提供了5个不同的访问级别,以下是从高到低排列,实体指被访问级别修饰的内容open:允许在定义实体的模块、其他模块中访问,允许其他模块进行继承、重写(open只能用在类、类成员上)public:允许在定义实体的模块、其他模块中访问,不允许其他模块进行继承、重写internal:只允许在定义实体的模块中访问,不允许在其他模块中访问fileprivate:只允许在定义实体的源文件中访问private:只允许在定义实体的封闭声明中访问绝...原创 2020-10-15 00:04:50 · 132 阅读 · 0 评论 -
十七、拓展
/*swift的扩展有点儿类似于OC的分类扩展可以分为枚举、结构体、类、协议添加功能,可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等等.扩展不能办到的事情:不能覆盖原有的功能、不能添加存储属性,不能向已有的属性添加属性观察器,不能添加父类、不能添加指定初始化器,不能添加反初始化器*///1.计算属性、下标、方法、嵌套类型var arr: Array<Int> = [10, 20, 30]extension Array { subscript(nul...原创 2020-10-15 00:04:26 · 69 阅读 · 0 评论 -
十六、高级运算符
/*1.溢出运算符:&+、&-、&*用来支持溢出运算swift的算术运算符出现溢出时会抛出运行时错误*/var min = UInt8.minprint(min &- 1) //255var max = UInt8.maxprint(max &+ 1) //0print(max &* 2) //255 * 2 - 256 = 254//2.运算符重载struct Point { var x = 0, y = 0 st...原创 2020-10-15 00:04:03 · 326 阅读 · 0 评论 -
十五、泛型
//1.泛型:泛型可以将类型参数化,提高代码复用率,减少代码量func swapValues<T>(_ a: inout T, _ b: inout T) { (a, b) = (b, a)}var i1 = 10var i2 = 20swapValues(&i1, &i2)var d1 = 10.0var d2 = 20.0swapValues(&d1, &d2)struct Date { var year = 0, month...原创 2020-10-15 00:03:43 · 95 阅读 · 0 评论 -
十四、错误处理
class Person { static var age = 0 static func run() {}}Person.age = 10Person.run()//等价汇编代码也是一样的Person.self.age = 10Person.self.run()//四个等价汇编代码也是一样的var p0 = Person() //init()var p1 = Person.self() //init()var p2 = Person.init() //init()v...原创 2020-10-15 00:03:31 · 123 阅读 · 0 评论 -
十三、协议
//1.协议/*协议可以用来定义方法、属性、下标的声明,协议可以被枚举、结构体、类遵守,多个协议之间欧诺个逗号隔开协议中定义方法时不能有默认参数值,默认情况下,协议中定义的内容必须全部实现,也有办法办到只实现部分内容。协议定义get、set,用var存储属性或get、set计算属性去实现*/protocol Drawable { func draw() var x: Int { get set } //协议中定义属性时必须用var关键字 var y: Int {...原创 2020-10-15 00:02:33 · 158 阅读 · 0 评论 -
十二、可选链
class Car { var price = 0 }class Dog { var weight = 0 }class Person5 { var name: String = "" var dog: Dog = Dog() var car: Car? = Car() func age() -> Int { 18 } func eat() { print("Person eat") } subscript(index: Int) -> Int...原创 2020-10-15 00:02:08 · 59 阅读 · 0 评论 -
十一、初始化
//1.初始化器/*类、结构体、枚举都可以定义初始化器。类有2种初始化器:指定初始化器、便捷初始化器.每个类至少有一个指定初始化器,指定初始化器是类的主要初始化器,默认初始化器总是类的指定初始化器,类偏向于少量指定初始化器,一个类通常只有一个指定初始化器。初始化器的相互调用规则:123*/class Person { var age: Int init(age: Int) { self.age = age } convenience ini...原创 2020-10-15 00:01:39 · 130 阅读 · 0 评论 -
十、方法、下标、继承
//1.方法/*枚举、结构体、类都可以定义实例方法、类型方法实例方法:通过实例对象调用,类似OC对象方法类型方法:通过类型调用,用static或者class关键字定义self,在实例方法中代表实例对象,在类型方法中代表类型*/class Car { static var cout = 0 init() { Car.cout += 1 } static func getCount() -> Int { self.cout /* 等价...原创 2020-10-14 00:53:30 · 137 阅读 · 0 评论 -
九、属性
//1.属性/*swift中跟实例对象相关的属性分为2大类存储属性:类似于成员变量这个概念,存储在实例对象的内存中结构体、类可以定义存储属性枚举不可以定义存储属性计算属性:本质就是方法(函数)不占用实例对象的内存枚举、结构体、类都可以定义计算属性*/struct Circle { var radius: Double //存储属性 var diameter: Double { //计算属性 set { r...原创 2020-10-14 00:52:08 · 118 阅读 · 0 评论 -
八、闭包
/*1.闭包表达式在swift中可以通过func定义一个函数,也可以通过闭包表达式定义一个函数{ (参数列表) -> 返回值类型 in 函数体代码}*/func sum(_ v1: Int, _ v2: Int) -> Int {v1 + v2}var fn = { //闭包定义函数 (v1: Int, v2: Int) -> Int in return v1 + v2}fn(10, 20)//2.闭包表达式的简写func exe...原创 2020-10-14 00:51:08 · 80 阅读 · 0 评论 -
七、结构体
//1.结构体//在swift标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分,比如Bool、Int、Double、String、Array、Dictionary等常见类型都是结构体,所有结构体都有一个编译器自动生成的初始化器(initializer、初始化方法、构造器、构造方法)struct Date { var year: Int //存储属性 var month: Int var day: Int}var date = Date(year: 2020, ...原创 2020-10-14 00:50:26 · 128 阅读 · 1 评论 -
六、可选项
//1.可选项,也叫可选类型,它允许将值设置为nil,在类型名称后面加个问号?来定义一个可选项var name : String? = "Jack"name = nilvar age : Int? //默认就是nilage = 10age = nilvar array = [1, 15, 40, 29]func get(_ index: Int) -> Int? { if index < 0 || index >= array.count { ret...原创 2020-10-14 00:49:11 · 438 阅读 · 0 评论 -
五、枚举
//1.枚举的基本用法enum Direction0 { case north case south case west case east}//等价于enum Direction1 { case east, west, south, north}var dir = Direction0.westdir = Direction0.eastdir = .southprint(dir)switch dir {case .east: pr...原创 2020-10-14 00:48:22 · 113 阅读 · 0 评论 -
四、函数
//1.函数的定义,形参默认是let 也只能是let,let省略了func pi() -> Double { return 3.14}pi()func sum0(v1: Int, v2: Int) -> Int { return v1 + v2}print(sum0(v1:1,v2:2))//3个无返回值等价 Void就是空元组public typealias Void = ()func sayHello0() -> Void { print(...原创 2020-10-14 00:47:29 · 61 阅读 · 0 评论 -
三、流程控制
//if 后的条件可以省略小括号 且条件只能是Bool let age = 4 if age {} 这样是错的let age = 4if (age >= 22) { print("married")} else if age >= 18 { print("being adault")} else if age >= 7 { print("go to school")} else { print("just a child")}//whil...原创 2020-10-14 00:44:51 · 112 阅读 · 0 评论 -
二、数据类型
let age1: Intage1 = 10let age2: Int = 10let age3 = 10/*常量只能赋值一次它的值并不要求在编译时期确定,但使用之前必须赋值一次*/var num = 10num += 20let age4 = numprint(age4)func getAge() -> Int { return 30}let age5 = getAge()//常量变量在初始化之前,都不能使用//let age : Int...原创 2020-10-14 00:43:01 · 90 阅读 · 0 评论 -
一、基础语法
一、基础语法Playground view 和 controllerimport UIKitimport PlaygroundSupportlet view = UIView()view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)view.backgroundColor = UIColor.redPlaygroundPage.current.liveView = viewlet imageView = UIImageView原创 2020-10-14 00:40:01 · 53 阅读 · 0 评论