Swift学习总结【持续更新】
1、 try、try?、try!的区别:
- try:需要用catch捕捉异常,如:
do {let data = try encoder.encode(item) try data.write(to: dataFilePath(), options: .atomic)} catch {print("Error encoding item array:\(error.localizedDescription)")}
- try? :返回一个可选值类型,如果出现异常,返回nil.如果没有异常,则返回可选值。(如果不想处理异常那么可以用这个关键字),如:
let data = try? encoder.encode(item)
try? data!.write(to: dataFilePath(), options: .atomic)
(因为使用try?所以data为可选类型,使用前需unwrap)
- try! : 抛出了异常后,程序会立刻停止(如果不想处理异常,而且不想让异常继续传播下去,类似NSAssert().), 如:
let data = try! encoder.encode(item)
try! data.write(to: dataFilePath(), options: .atomic)
2、 PropertyListEncoder、NSKeyedArchiver、NSUserDefault
- PropertyListEncoder
使用 PropertyListEncoder可以对遵循Codable协议的类进行归档
将包含自定义类HighScoreItem的数组进行归档:
static func saveHighScore(_ item:[HighScoreItem]){let encoder = PropertyListEncoder()do {let data = try encoder.encode(item)try data.write(to: dataFilePath(), options: .atomic)} catch {print("Error encoding item array:\(error.localizedDescription)")}
}
解档:
static func loadHighScores() -> [HighScoreItem]{var items = [HighScoreItem]()let path = dataFilePath()if let data = try? Data(contentsOf: path){let decoder = PropertyListDecoder()do{items = try decoder.decode([HighScoreItem].self, from: data)}catch{print("Error decoding item array:\(error .localizedDescription)")}}return items
}
- NSKeyedArchiver
NSKeyedArchiver可以将遵守NSCoding协议的Cocoa类进行归档,将数据转换为 Data 类型,然后再存储到UserDefaults或写到文件:
do {let data = try NSKeyedArchiver.archivedData(withRootObject: item, requiringSecureCoding: true)try data.write(to: dataFilePath(), options: .atomic)
} catch {print("Error encoding item array:\(error.localizedDescription)")
}
- NSUserDefault
适合存储数据量较少的数据
let defaults = UserDefaults.standard
defaults.set(item, forKey: "item");
3、NSArry和Array
Array是Swift中的结构体类型(struct), 属于是值类型.
NSArray是OC中的对象类型, 属于引用类型.
var aarr = ["happy", "every", "day"]var barr : NSMutableArray = ["happy", "every", "day"]//1aarr[2] = "minute" //直接改变了aarr第二个元素的值barr[2] = "minute" //让barr第二个元素指向"minute"print("1---\(aarr)")print("1---\(barr)")/*输出:1---["happy", "every", "minute"]1---(happy,every,minute)*///2func changeA (var a:Array<String>) {a[2] = "second" //a是对aarr的拷贝}func changeB (a : NSMutableArray) {a[2] = "second" //a是对barr的引用}changeA(aarr) //值类型赋值时进行拷贝, 改变是a[2]的值, aarr并没有影响changeB(barr) //引用类型赋值时传递的是引用, a[2]和barr[2]都指向同一个地址.print("2---\(aarr)")print("2---\(barr)")/*输出:2---["happy", "every", "minute"]2---(happy,every,second)*/
代码来自HWenj的文章《Swift中Array和OC中的NSArray》
4、weak和unowned区别
- unowned标识的变量不能是可选类型(Optional),不能指向nil,必须在 init 方法中初始化值。
- weak标识的变量可以为可选类型,可以指向nil。
参考:纠结的哈士奇的文章
5、oc和swift中==的区别
如果比较的是类(引用类型)
- 在Objective-C 中,只有两个对象指向的内存地址一样才为true
- 在Swift中,对比的是对象的值,跟内存地址无关(如果要对比内存地址使用===)
6、方法的参数
一般方法会有一个或多个参数,每个参数会有两个名字,外部参数名(external label)和内部参数名(internal label),例如:
func downloadImage(for searchResult: SearchResult, withTimeout timeout: TimeInterval, andPlaceOn button: UIButton) {. . .
}
这个方法有3个参数searchResult、timeout、button,这些是内部参数名,可以在方法内使用。
而外部参数名是方法名的一部分,即以上方法名为:downloadImage(for:withTimeout:andPlaceOn:)
调用方法时,写法为:
downloadImage(for: result, withTimeout: 10, andPlaceOn: imageButton)
有些方法第一个外部参数名会以下划线“_”代替,从而忽略外部参数名,如:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
这些方法一般都是来源于过去Objective-C的写法,已经把首个外部参数名合并在方法名之中。
7、switch技巧
可以通过"…<"匹配范围。如:
switch difference {case 0:title = "Perfect!"case 1..<5:title = "You almost had it!"case 5..<10:title = "Pretty good!"default:title = "Not even close..."
}
8、for循环技巧
循环遍历数组时,我们这样写:
for item in items {if !item.checked {count += 1}
}
可以在后面加上条件选择
for item in items where !item.checked {count += 1
}
如果我们想要循环n次,可以这样写:
for i in 0...4 { // or 0..<5print(i)
}
也可以通过stride方法:
for i in stride(from: 0, to: 5, by: 1) {print(i)
}
stride()方法创建了代表从0到5,增长间隔是1的对象。如果想输出从0到5的偶数,则把最后一个参数改为2,如果想要倒数,最后的参数传入负值即可。
9、通过filter筛选
如果要筛选出数组中,符合某一条件的对象。如筛选出items数组中,属性checked为false的对象,可以用filter方法
var uncheckedItems = items.filter { item in !item.checked }
10、存储属性(Stored property)vc计算属性(Computed property)
- 存储属性:常见的实例变量和常量
- 计算属性:不存储数据,在读和写时会执行逻辑代码,如:
var indexOfSelectedChecklist: Int {get {return UserDefaults.standard.integer(forKey: "ChecklistIndex")}set {UserDefaults.standard.set(newValue, forKey: "ChecklistIndex")}
}
11、类中的方法
类的方法有三种:
- 实例方法:需要先创建实例,才能调用,如:
let myInstance = MyObject() // create the object instance
. . .
myInstance.doSomething() // call the method”
- 类方法:不需要创建实例,直接由类调用,常用做工厂方法来创建实例,如:
class MyObject {. . .class func makeObject(text: String) -> MyObject {let m = MyObject()m.text = textreturn m}
}let myInstance = MyObject.makeObject(text: "Hello world")
- 初始化方法:除了上面的工厂方法,也可以使用自定义的初始化方法,用于创建和初始化实例。在初始化方法中,实例变量和常量必须被赋值(Swfit要求在初始化方法执行完之后,变量和常量除非是可选类型,否则必须被赋值),如:
class MyObject {. . .init(text: String) {self.text = text}
}let myInstance = MyObject(text: "Hello world")
一个类的初始化方法可以有多个,如UITableViewController有init?(coder:)、init(nibName:bundle:)、init(style:) 等多个初始化方法。
12、if判断技巧
如果我们要用if判断多个条件,在Objective-C中可以用“&”进行连接,而在Swift中可以使用“,”进行连接,如:
if error == nil, let p = placemarks, !p.isEmpty {self.placemark = p.last!
} else {self.placemark = nil
}
只有error为nil、p不为nil、p数组不为空(placemarks为数组)三个条件同时为真,if判断才为真。
13、 as、as?、as!的区别:
【先下班】
相关文章:

svn清理失败且乱码 问题解决(转)
由于昨天在网络不好的状态下频繁尝试svn更新,导致今天svn更新时出现:清理失败且乱码的情况如下: 以下是解决方案:1.下载sqlite3.exe ,地址为:http://download.csdn.net/detail/whyzzj/63465292.在D盘建立文件夹 tools …

UI学习第二篇 (控件)
UIbutton 也是一个控件,它属于UIControl 用的最多的就是事件响应 1. //创建按钮对象 UIButton * _botton [UIButton buttonWithType:UIButtonTypeCustom]; //设置标题 [_botton setTitle:"按住说话" forstate:UIControlStateNormal]; [_botton setTitle:…

如何高效地爬取链家的房源信息(四)
“Python实现的链家网站的爬虫第四部分,最后一部分。”本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用。本系列第一部分为基础:如何高效地爬取链家…

Quartz2D在项目中的实际使用
还记得大学刚学iOS那会,从学校图书馆借了本iOS开发的书,有一章节介绍了Quartz2D,当时看得一头雾水,感觉这画画线,画画圆有什么用呢🤔️?工作一段时间后,遇到了一些需求,终…

区别:电感、磁珠和零欧电阻的作用
转载:http://www.cntronics.com/sensor-art/80022840 【导读】电感、磁珠和零欧电阻在电路中是常见的身影。对于这三者在电路中的作用及它们之间的区别,相信还有很多工程师不是很清楚。不过没关系,小编在此为大家奉上一篇关于电感、磁珠和零欧…

【转载】Linux下安装、配置、启动Apache
原文地址:http://www.cnblogs.com/zhuque/archive/2012/11/03/2763352.html 安装Apache前准备: 1、检查该环境中是否已经存在httpd服务的配置文件,默认存储路径:/etc/httpd/httpd.conf(这是centos预装的Apache的一个ent版本&#…

MIME格式解析
“ 本文介绍常见的MIME数据格式。”在协议还原中,不可避免地,经常会在各类协议内容中碰到MIME格式,例如标准邮件协议、HTTP协议。那么,什么是MIME呢?MIME是英文Multipurpose Internet Mail Extensions的缩写࿰…

AngularJs--过滤器(filter)
过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果。主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等。ng内置了一些过滤器…

【一步步学小程序】1.创建项目以及TabBar
1.创建项目 如图,创建项目,输入项目名称、选择目录,AppID是唯一标识,我们可以先点如图红框内的测试号,自动生成一个AppID,然后点新建即创建完一个新项目。 2.创建3个页面 确保如图左上角的编译器按钮是…

Yii在window下的安装方法
首先,在http://www.yiichina.com/上下载yii 然后,配置系统环境变量,在win8下,按winx,找到系统->高级系统设置->环境变量->path 把php的运行环境,加入到环境变量中,以分号隔开。如&…

从新手到入门,如何进入协议分析的世界
“ 协议分析与还原自学及入门指南。”有部分朋友给我发消息,说对协议还原很感兴趣,但苦于没人指导,希望得到我的帮助,问我如何进行协议分析的学习。这篇文章从初学者的角度,编列了一个学习指南,希望能对协议…

C# 学习笔记01
想写一个app可以访问数据库,实现对数据库的查询,修改等,突然发现知识实在有限,故选择C#来实现此app。 使用简单的三层架构来作为此app的架构。表现层(UI)、业务逻辑层(BLL)、数据访问…
转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js
iOS js oc相互调用(JavaScriptCore) 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCor…

【一步步学小程序】2.列表展示
我们上一节已经创建了一个可以点击切换的tabbar。这节我们开始正式敲代码,在首页上展示一个可以上下滚动的课程列表: 首先打开上一节的pages/home/homeMain/homeMain.wxml文件,布局相关代码都会在此文件中,小程序的布局方式类似H…

git分支的合并
原文: http://gitbook.liuhui998.com/3_3.html http://gitbook.liuhui998.com/5_3.html 一、如何分支的合并在git中,可以使用git merge 和git rebase两个命令来进行分支的合并。git merge 和git rebase在大体上都差不多,下文主要以git merg…

【一步步学小程序】3. 使用自定义组件(component)
上一节创建了一个包含多个课程数据的列表。这一节我们用自定义组件(component),来优化列表页面,即如图,我们把每个课程单元格封装为组件。 使用组件的好处: 自定义组件可以在不同的页面中重复使用将复杂…

《lua程序设计(第二版)》学习笔记(五)-- 函数基础
-- 第 5 章 函数-- 一种对语句和表达式进行抽象的主要机制 print(os.date()); -- 打印日期 Sun Apr 20 12:44:46 2014 -- 一看到sun,感慨广州没有晴天 -- 函数没有参数也要括号 -- 特殊情况:只有一个参数的时候, 并且参数一个string/table构造…

HTTP协议中的chunked编码解析
“ HTTP协议中的chunked传输编码全接触。”在HTTP协议中,服务器发往客户端的数据中,通常都包括HTTP头和HTTP体,当存在HTTP体的时候,HTTP体的长度通常是由HTTP头内的“Content-Length”字段确定。就像下图:不过…

html-css实例
<!DOCTYPE html> <html><head><meta charset"utf-8" /><title>求签</title><style type"text/css">*{margin: 0px;padding: 0px;font-family: "微软雅黑",arial,sans-serif;}body{background: url(im…

【Swift】变量/常量/类型总结
1、变量(Variable) 变量,可以理解为存放某一类型的值的容器,如: var count:Int var shouldRemind:BOOL var text:String var list:[ChecklistItem]一个变量的数据类型,决定了它能存放什么类型的数据。有些…

ODBC更新记录集提示”记录集为只读“
创建的ODBC应用程序默认的记录集不具有只读属性,但是再更新记录表时会提示”记录集为只读“,这是为什么呢? 今天看书找到了答案: 因为MFC中的数据库类不支持需要连接两个或者多个表的记录集更新,如果选择数据源的时候选…

gzip格式分析与识别
“ 介绍gzip格式,识别gzip压缩的数据流量。”在协议分析过程中,经常会发现gzip压缩的数据,例如在HTTP协议中,在HTTP头中会标示,内容编码为gzip、DEFLATE。但是,还有很多情况,例如一些非HTTP协议…

CSS 和 JS 动画哪个更快
基于Javascript的动画暗中同CSS过渡效果一样,甚至更加快,这怎么可能呢?而Adobe和Google持续发布的富媒体移动网站的性能可媲美本地应用,这又怎么可能呢? 本文逐一遍览了基于Javascript的DOM动画库,如Veloci…

C语言之分支结构 if(一)
一 程序的三种基本结构 顺序结构:程序从上往下依次执行,这个叫顺序结构 分支结构:有选择的执行或者不执行某段代码 循环结构:重复的执行某段代码 二 分支结构之if 最简单的俩种用法 (tips: if语句后面的大括号可以省略:…

react-native安装Ant Design
1.集成Ant Design到项目 项目根目录中执行命令: npm install ant-design/react-native --save2.集成按需加载babel-plugin-import到项目 项目根目录中执行命令: npm install --save-dev babel-plugin-import3.创建.babelrc文件 根目录中创建新文件…

车联网APP,安全设施薄弱的山寨品
“ 目前的车联网APP,几乎没有安全性可言。”在网络上闲逛,一不小心,逛进了车联网的领地。物联网、车联网、IoT如火如荼,各个大佬、院士加持,看着相当的高大上。但是,在伟岸的外表下,到底真实的情…

CSS里总算是有了一种简单的垂直居中布局的方法了
<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>无标题文档</title><style type"text/css"&…

【星榜单】盘点那些坑爹的国产手机们
【星榜单】盘点那些坑爹的国产手机们 国产手机的那些坑爹事儿很多,中庸到基本大众脸的设计还算是有点良心的,那些奇葩的名字、所谓的高配低价低却又山寨级的做工、饥饿营销让你看得到买不到、伪小清新却又华而不实放眼过去的国产智能手机比比皆是&#x…

App Tracking Transparency被拒解决
App Tracking Transparency 如果使用了App Tracking Transparency,苹果要求在iOS 14.5及以上的版本中必须在弹框取得用户同意后,才可以跟踪用户。否则会被拒: 解决方案 参照官方文档说明(https://developer.apple.com/documen…

ProtoBuf格式详解
“介绍protobuf编码格式。”protobuf是一种数据交换格式,又称PB编码,由Google开源,类似于Json、XML,但其内部是纯二进制格式,比Json,XML等格式要更精炼,主要用于数据的序列化和反序列化…