![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Swift
乐事派
iOS开发者
展开
-
Swift基础 guard
guardguard与if语句功能非常相似,设计出它的目的,其实是为了提高程序的可读性(重点)。guard语句必须在函数中使用,并且必须带有else语句。当条件表达式为真的时候,则跳过else语句。当条件表达式为假的时候,则执行else语句。而且else语句内必须带有return、break、continue、throw语句。let age = 17func allowToMakeCola(){ guard age < 18 else { print("可以瑟瑟原创 2022-05-16 11:26:17 · 1090 阅读 · 0 评论 -
Swift基础 throws do-catch 错误的捕获和处理
错误的捕获和处理throws关键字用于抛出错误。do-catch用户捕获代码中可能出现的一场并妥善处理异常。//定义一个错误枚举,遵循Error协议enum PersonError:String,Error{ case PersonErrorDoNotEatBreakfast = "不吃早餐" case PersonErrorDoNotTakeExercise = "不锻炼"}class Person{ var age:Int var name:String原创 2022-05-16 11:27:13 · 635 阅读 · 0 评论 -
Swift基础 多态
多态多态指的是,同一个方法在不同的实例中,会有不同的执行效果。swift中有两种引用变量类型,一种是编译时,另一种是运行时。class Person{ var name : String init(personName: String) { name = personName } func eat() -> () { print("\(name)吃饭") } func getup() ->原创 2022-05-15 18:07:49 · 352 阅读 · 0 评论 -
Swift基础 闭包
闭包闭包是用大括号括起来的,可以没有名字的函数类型的实例。闭包有三种形式:全局函数:具名函数,但不捕获任何值嵌套函数:在函数内部嵌套定义具名函数,可捕获包含函数中的值。闭包表达式:匿名函数类型的实例,不具名代码块,可捕获上下文中的值。闭包是引用类型,闭包变量的拷贝具有引用语义。闭包和函数实例具有同样的内存模型。表达式:{(参数列表1,参数列表2,...)->(返回值) in 函数体执行的内容}示例:var closure = {(number1:Int,number2原创 2022-05-15 18:07:07 · 249 阅读 · 0 评论 -
Swift基础 函数作为参数类型
函数类型函数类型是一种引用类型,类似于函数指针,可以将函数类型应用在参数、变量、返回值等地方。函数类型的定义:(参数列表1,参数列表2,...)->返回值类型示例代码:class Person{ var name : String init(personName: String) { name = personName }}class Student: Person { var classmate : Student? var原创 2022-05-15 18:05:00 · 515 阅读 · 0 评论 -
Swift基础 循环引用导致内存泄漏
实例对象之间循环强引用ARC并不是绝对安全的,当两个实例对象间相互强引用,就会造成引用循环,导致所占用的内存无法释放。class Person{ var name : String init(personName: String) { name = personName }}class Student: Person { var classmate : Student? override init(personName: String) {原创 2022-05-15 18:02:52 · 484 阅读 · 0 评论 -
Swift基础 重写父类已有的方法
重写重写方法重写父类已有的方法,需要在方法名前加 override 的关键字。class Person{ var age:Int var name:String init(name:String,age:Int){ self.name = name self.age = age }}class Student:Person{ var classScore:Dictionary<String,Int> =原创 2022-05-15 18:01:48 · 897 阅读 · 0 评论 -
Swift基础 类型检查、强转、对象的释放
类型检查类型检查通过is与as两个操作符来实现。is 操作符可以判断两个实例是否是同一个类。as 操作符可以将元素转化为想转化的类。Any与AnyObjectswift中针对不确定类型的对象有两种特殊的别名,Any和AnyObject。Any表示任意的类型,包括类、结构体、基本数据类型等等。AnyObject只能表示任意的类的实例对象,结构体对象不能用这个表示。实例对象的销毁析构是实例对象释放前所做的动作,需要释放它所占有的内存资源。析构器 deinitializer 不需要任何参数。原创 2022-05-15 17:59:50 · 938 阅读 · 0 评论 -
Swift基础 类的属性与特殊方法(监听、延迟加载)
类的willSet()和didSet()通过给类的属性添加willSet()和didSet()方法,可以给类的属性增加观察者。其被设置的新的属性值,如果不进行重命名的话,就是默认名newValue。 static var locationMSVersion : NSNumber = 0 { didSet{ if onlineMSVersion != 0 { compareMSVersion() }原创 2022-05-15 17:57:52 · 439 阅读 · 0 评论 -
Swift基础 类的初始化方法-构造函数
类的初始化类的初始化是调用init()方法进行的,在 Objective-C 中,init()方法是不安全的,因为init()方法可能被调用不止一次,也不能保证初始化后所有的成员属性都不为空、都有值。对于不需要立刻初始化的属性,需要在声明类型后增加 ? 符号Designated(指定的、标记的)所以 Swift 有了超级严格的初始化方法。一方面,Swift 强化了 designated 初始化方法的地位。Swift 中不加修饰的 init 方法都需要在方法中保证所有非 Optional 的实例变原创 2022-05-15 17:56:00 · 373 阅读 · 0 评论 -
Swift基础 关于类与类的继承
类类与结构体的区别:类可以有继承关系,子类可以使用父类的特性和方法,而结构体没有。类型转换可以在运行时检查和解释为另一个类的实例。deinit反初始化可以做到释放所占用的内存资源。类的引用计数可以做到不止一个对另一实例的引用。格式:class 类名 : 父类名 { 数据成员(变量)定义 函数成员(方法)定义和实现}案例:class Person { var name : NSString var height : CGFloat var se原创 2022-05-15 17:54:33 · 296 阅读 · 0 评论 -
Swift基础 map
map用法:let numbers = [1,2,3,4]let result = numbers.map { $0 + 1 }print(result) // [2,3,4,5]map 方法接受一个闭包作为参数, 然后它会遍历整个数组,并对数组中每一个元素执行闭包中定义的操作。原创 2022-05-08 15:26:55 · 526 阅读 · 0 评论 -
Swift基础 for循环
循环语句下的forloopforloop是标签语句,一般用于结束循环(主要是外循环) var i,j:Int var s:Int forloop:for i in 1...10 { for j in 1...10 { s = i*j print("i*j=\(s)") if (s>50) { print("i*j>50,退出外循环");原创 2022-05-08 15:26:15 · 2598 阅读 · 0 评论 -
Swift基础 泛型
泛型在程序设计中,要实现任意数据类型执行统一的一段操作,可以运用模版,对于整型、字符型、浮点型或者其他类型,均可以实现,这就叫泛型,可以重复利用。编写泛型函数的步骤是:将涉及不同代码的部分用T表示。 struct Student { var name = "name" var height = 160.00 } override func viewDidLoad() { super.viewDidLoad()原创 2022-05-08 15:25:47 · 147 阅读 · 0 评论 -
Swift基础 some关键字不透明结果类型
some关键字 不透明结果类型在某一些情况下,我们需要返回接受一个遵守了某协议的对象,该对象可以是任何类,但需要遵守某个协议即可,并不限定类的类型。这个时候就会有以下问题:协议:protocol ProtocaltTalk{ associatedtype words func say(words:words)}该协议定义了说话,遵守该协议的可以是人类,可以是动物,可以是机器人。遵守ProtocaltTalk协议的两个类型(简单举例):class Person:Protocal原创 2022-05-08 15:25:19 · 590 阅读 · 0 评论 -
Swift基础 协议
协议协议的关键字是protocal。协议只需定义,没有实现的部分。协议也分两种,属性协议和方法协议。属性协议属性协议的声明用var声明,在声明后,要设置get方法或者set方法、get方法一起设置。//协议class Person{ var age:Int var name:String init(name:String,age:Int){ self.name = name self.age = age }}prot原创 2022-05-08 15:24:56 · 243 阅读 · 0 评论 -
Swift基础 扩展
扩展关键字extension,扩展的目的就是衍生原来没有的功能,可以扩展属性、方法、索引。并且可以在没有获得原始代码的情况下扩展。在oc中是以runtime来实现动态调用和添加功能的。现有的类、结构体、枚举可以在扩展的方式下添加方法,但重写的方法不能使用扩展。属性扩展extension Double{ var q:Double{return self/1000} var w:Double{return self/10000}}override func viewDidLoad(原创 2022-05-08 13:05:15 · 193 阅读 · 0 评论 -
Swift基础 函数
函数函数的声明方式: func 函数名(参数列表) -> 返回值 { 参数列表里的数据表示方式: 参数名:参数类型 函数体 }案例: struct Student { var name = "name" var index = 202100 var height = 160.00 var profession = "profession" var sex = "男"原创 2022-05-08 13:05:02 · 328 阅读 · 0 评论 -
Swift基础 结构体
结构体声明结构体的关键字是struct,使用起来和类相似,但类的成员是引用类型,而结构体的成员是值类型。值类型在传递和赋值的时候,是进行复制的,那也就是说在修改一处复制体的时候,原来被复制的对象是不受影响的。引用类型在传递和赋值的时候,是传递引用对象的一个“指向”,所以当对该引用进行修改的时候,是直接直接修改到最原始的对象,即,一旦修改值,则对该原始对象的所有引用都会被同步修改。在内存中,引用类型的变量是在堆上存储和操作的。值类型的变量是在栈上存储和操作的。两者相比起来,在堆上的变量操作会比较复杂和原创 2022-05-08 13:04:26 · 446 阅读 · 0 评论 -
Swift基础 枚举
枚举使用枚举会使得编程的过程更加安全,因为一旦使用了不是枚举的值,系统就会立刻给出反馈。 enum Direction{ case North case South case East case West } let directuin = Direction.South switch directuin { case .North: print("North") case .South:原创 2022-05-08 13:03:54 · 159 阅读 · 0 评论 -
Swift基础 Switch分支语句
Switch分支语句在swift中的Switch语句是没有穿透效果的,也就是匹配到对应的值之后,运行完代码所属的代码块就结束了。相较于传统的不同,传统的匹配完之后,还会一一往下再与每个case比较。switch还可以匹配多个值: let index = "A" switch index { case "A","B","C": print("通过,及格") case "D","E": print("不通过,不及格") default原创 2022-05-08 13:03:18 · 630 阅读 · 0 评论 -
Swift基础 Dictionary字典
字典字典和数组都是集合类型,字典元素可以是值类型也可以是引用类型。键名不允许重复。字典的声明方式(三种)显式: var studentList : Dictionary<String,Float> = ["xiaoMing":172.5,"xiaoHong":168.5] for (name,height) in studentList { print("\(name):\(height)"); }运行结果:xiaoMing:172.5xi原创 2022-05-06 11:45:27 · 624 阅读 · 0 评论 -
Swift基础 集合Set
集合定义集合是无序的,数组是有序的。var a:Set = [1,2.0,3.14,48]var b:Set<Int> = [1,2,3,4,5]基本的增删改查和数组类似。Set合并var a:Set = [1,2,3,4]var b:Set = [1,2,3,4,5]var c = a.union(b)print(c)//运行结果:[1,3,2,5,4]//相同的元素合并时会略过除此之外还有比较两个集合异同的方法。Set的过滤和数组的使用方法一致。可点阅我的文原创 2022-05-06 11:44:18 · 296 阅读 · 0 评论 -
Swift基础 Array数组
数组数组是用来存储相同类型数值的序列化列表。 let studentName : [NSString] = ["xiaoMing","xiaoHong"] var studentHeight : Array<CGFloat> = [172.5,168] studentHeight[1] = 168.5 print(studentName) print(studentHeight)运行结果:[xiaoMing, xiaoHong][172.5, 1原创 2022-05-06 11:42:26 · 647 阅读 · 0 评论 -
Swift基础 while repeat-while循环
swift里没有do-while循环,换了个名字叫repeat-while循环repeat-while循环实际上就是do-while循环… var sum = 0 var index = 0 repeat{ index+=1 sum+=index }while( index < 100) print(sum);运行结果: 5050...原创 2022-05-06 11:41:25 · 263 阅读 · 0 评论 -
Swift基础 区间运算符
区间运算符闭区间运算符:a … b半闭区间运算符:a …< b常用于循环结构中.for-in循环for-in循环语句中是使用区间运算符来控制循环的。 var sum = 0 for index in 1 ... 10 { sum+=index; } print(sum);for-in循环语句中使用stride函数来控制循环,这会使得在一定的区间内跳过某些数值,比如2,4,6,8,10,以间隔2为遍历。 for index in st原创 2022-05-06 11:38:47 · 210 阅读 · 0 评论 -
Swift基础 元组数据类型
元组:不同数据类型的封装将不同类型的字面值用括号括起来的元素。 let student = (2021,"xiaoMing",172.5) let student(Int,String,Double) = (2021,"xiaoHong",160.5)对元组元素初始化,对其中内部的值命名。 let student = (year:2021,name:"xiaoMing",height:172.5) print(student.year) print(studen原创 2022-05-06 11:37:18 · 219 阅读 · 0 评论 -
Swift 关于数据类型、可选类型
类型别名给数据类型取别名。比如给Int数据类型取别名,一个叫小孩,一个叫少年,一个叫青年,一个叫老年。实际上都是Int数据类型,只不过在代码阅读的时候,方便理解得多。给数据类型取别名,使用typealias关键字。 typealias child = Int typealias Teenager = Int typealias young = Int typealias old = Int类型转换强制转换:() var a = 11 var b =原创 2022-05-06 11:36:22 · 363 阅读 · 0 评论 -
Swift基础 String类型
关于字符串判断是否包含字符 var a = "hello" if a.contains("hell"){ print("hell") }追加字符 var a = "hello" a.append(" world") print(a)//运行结果:hello world插入字符 var a = "hello" //从0开始算,在3的位置插入“ ” a.insert(contentsOf:" ", at:a.index(a.star原创 2022-05-06 11:33:25 · 1038 阅读 · 0 评论 -
Swift基础 let与var 和 关于声明
let 常量程序运行期间,值不可改变的量。 let word = "hello world" let 常量名 = 值var 变量可变化的数据。 var word = "hello world" word = "你好" //值可更改 var 变量名 = 值声明变量的数据类型:可显式声明也可以不声明: var year : Int = 2018 var old = 18当为隐式声明的时候,编译器会通过初始值来推断变量的类型。那么也就是原创 2022-05-06 11:31:20 · 219 阅读 · 0 评论 -
关于定位 MapKit 与 CLCoreLoaction
MapKit 用于地图展示Core Location 用于地理定位LBS : location based service 基于定位的服务CoreLocation定位所包含的类都在CoreLocation模块中,使用时必须导入。CLLocationManager:定位管理器,可以理解为定位不能自己工作,需要有个类对它进行全过程管理。CLLocationManagerDelegate:定位管理代理,不管是定位成功与失败,都会有相应的代理方法进行回调。CLLocation:表示某个位置的地理信息,原创 2022-04-26 10:38:59 · 187 阅读 · 0 评论 -
UISegmentedControl如何使用
模样使用场景当用户输入不仅仅是布尔值时,可使用分段控件(UISegmentedControl)。分段控件提供一栏按钮(有时称为按钮栏),但只能激活其中一个按钮。分段控件会导致用户在屏幕上看到的内容发生变化。它们常用于在不同类别的信息之间选择,或在不同的应用屏幕之间切换。使用流程需要选项卡的一个数组根据选项卡数组初始化创建(frame、selectedindex、color、样式等等,还可以设置置顶选项的宽度,添加点击选项的事件,和按钮的添加事件一样,都是addTarget。...原创 2022-04-26 10:30:51 · 368 阅读 · 0 评论 -
斯坦福Stanford公开课2017年版CS193p课程iOS11开发01-翻牌游戏
翻牌游戏老师主要运用的是storyboard来编写程序,但说实话,真的用起来很不习惯。还是用回纯代码编写吧。主要知识点:观察属性@objc标签class ViewController: UIViewController { var count = 0 { didSet{ scoreLabel.text = "消耗步数:\(count)" } } let fruitKindArray = ["🍎","🍉"原创 2022-03-02 22:17:15 · 3966 阅读 · 0 评论 -
iPhone开发Swift基础09 Assets
Assets上设置颜色集合使用颜色集合可以使得应用程序的风格一致。选取颜色接着在代码里面使用:由于颜色集是iOS11才出现的新特性,所以使用时需要进行系统版本判断。if #available(iOS 11.0, *){ self.view.backgroundColor = UIColor(named: "ForegroundColor")}运行结果:Assets上设置矢量图片在过去的开发,因为需要适配不同尺寸的屏幕,因此图片资源经常需要准备三种尺寸@1x、@2x、@3x。原创 2022-02-12 15:13:54 · 1364 阅读 · 0 评论 -
iPhone开发Swift基础08 加密与安全
三种常见的加密技术:3DES、SHA1、MD5。其中3DES和SHA1为对称加密,MD5为非对称加密。加密我们可以做的加密措施有哪些?对设备中存储的内容进行加密,开发者经常使用的UserDefaults、plist文件、CoreData框架等作为存储数据的载体,在存入数据之前做一些加密以增强数据的安全性是很有必要的。对网络传输的数据进行加密,大部分的引用都需要进行网络通讯,由于网络传输的过程中的一些中间节点并不可控,所以必然存在着数据泄漏的风险,对敏感信息进行加密以保证用户的隐私权是很有必要的。原创 2022-02-12 12:03:07 · 4202 阅读 · 0 评论 -
iPhone开发Swift基础07 内存泄漏检测
InstrumentsInstruments工具是用于动态跟踪和分析代码的工具,可以跟踪一个或者多个进程,并检测收集实时数据,使开发者更好地理解应用程序和操作系统的行为和性能。追查代码中难以重现的问题对应用程序进行性能分析自动化测试应用程序中的代码对应用程序进行压力测试进行一般的系统级故障诊断对应用程序的代码如何工作有更加深入的了解AllocationsInstruments中的Allocations工具可以显示内存中的对象占用曲线,内存当前都分配给那些对象、被分配内存对象数量以及由哪原创 2022-01-09 14:08:23 · 1892 阅读 · 0 评论 -
iPhone开发Swift基础06 单元测试和界面测试
测试的重要性应用要是想要上架苹果商店,就必须通过苹果商店的审查,如果应用程序没有经过测试就提交的话,那么在审核时发现不符合上架条件的情况,就会被拒绝上架,这样就会造成很不必要的时间等待成本。单元测试单元测试是一种白盒测试,应用程序的开发者对现有的模块编写相应的测试代码进行测试,其中包含测试用例的设计。单元测试是通过XCTest框架对程序的最小单元进行正确性检测的测试工作的。最小可测试部件通常包括基类、抽象类、子类。新建的项目要想使用单元测试,只需要在创建项目时勾选Unit Test 选项即可。但原创 2022-01-09 01:25:50 · 774 阅读 · 0 评论 -
iPhone开发Swift基础05 数据持久化 CoreData
iOS中的数据持久化方式有4种:plist属性列表对象归档SQLite3Core DataPlistplist文件主要是以键值对的方式存储属性、配置信息,也可以用于存储项目中的业务数据。我们常用的UserDefaults类其实也是用plist文件进行存储的。解析Plist//组织plist文件地址let configPlistPath : String = Bundle.main.path(forResource: "bomsConfig", ofType: "plist")!//通原创 2022-01-05 17:47:23 · 2359 阅读 · 0 评论 -
iPhone开发Swift基础04 WKWebView与Html5 未完待续
主要介绍如何使用UIWebView网页视图和Html标签、CSS样式表、JavaScript语言等Html5相关技术。相对于原生应用,Html5具有以下优点:一次编写,到处运行。在服务器完成更新部署。不可避免的有得有失,Html5应用相比原生应用而言,在流畅性、访问设备硬件便利性、用户体验等方面时有差距的。因此在iOS开发中,权衡利弊下,采用混合开发的模式,用原生技术创建不经常改变的布局页面和功能,用Html5创建需要实时变化的页面和功能。比如在开发营销管理系统时,大部分页面和功能都采用原生原创 2021-12-25 17:06:30 · 226 阅读 · 0 评论 -
iPhone开发Swift基础03 视频、网络请求
视频播放AVPlayeriOS9之前使用的是MPMoviePlayerController,随着iOS不断迭代,AVPlayer成为主流。往项目中添加资源文件:import UIKitimport AVFoundationclass ViewController: UIViewController{ var avPlayer : AVPlayer? override func viewDidLoad() { super.viewDidLoad()原创 2021-12-25 13:55:42 · 2055 阅读 · 0 评论