当前位置: 首页 > 编程日记 > 正文

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更新&#xff0c;导致今天svn更新时出现&#xff1a;清理失败且乱码的情况如下&#xff1a; 以下是解决方案&#xff1a;1.下载sqlite3.exe ,地址为&#xff1a;http://download.csdn.net/detail/whyzzj/63465292.在D盘建立文件夹 tools …

UI学习第二篇 (控件)

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

如何高效地爬取链家的房源信息(四)

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

Quartz2D在项目中的实际使用

还记得大学刚学iOS那会&#xff0c;从学校图书馆借了本iOS开发的书&#xff0c;有一章节介绍了Quartz2D&#xff0c;当时看得一头雾水&#xff0c;感觉这画画线&#xff0c;画画圆有什么用呢&#x1f914;️&#xff1f;工作一段时间后&#xff0c;遇到了一些需求&#xff0c;终…

区别:电感、磁珠和零欧电阻的作用

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

【转载】Linux下安装、配置、启动Apache

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

MIME格式解析

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

AngularJs--过滤器(filter)

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

【一步步学小程序】1.创建项目以及TabBar

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

Yii在window下的安装方法

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

从新手到入门,如何进入协议分析的世界

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

C# 学习笔记01

想写一个app可以访问数据库&#xff0c;实现对数据库的查询&#xff0c;修改等&#xff0c;突然发现知识实在有限&#xff0c;故选择C#来实现此app。 使用简单的三层架构来作为此app的架构。表现层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;、数据访问…

转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

iOS js oc相互调用&#xff08;JavaScriptCore&#xff09; 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCor…

【一步步学小程序】2.列表展示

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

git分支的合并

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

【一步步学小程序】3. 使用自定义组件(component)

上一节创建了一个包含多个课程数据的列表。这一节我们用自定义组件&#xff08;component&#xff09;&#xff0c;来优化列表页面&#xff0c;即如图&#xff0c;我们把每个课程单元格封装为组件。 使用组件的好处&#xff1a; 自定义组件可以在不同的页面中重复使用将复杂…

《lua程序设计(第二版)》学习笔记(五)-- 函数基础

-- 第 5 章 函数-- 一种对语句和表达式进行抽象的主要机制 print(os.date()); -- 打印日期 Sun Apr 20 12:44:46 2014 -- 一看到sun&#xff0c;感慨广州没有晴天 -- 函数没有参数也要括号 -- 特殊情况:只有一个参数的时候, 并且参数一个string&#xff0f;table构造…

HTTP协议中的chunked编码解析

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

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、变量&#xff08;Variable&#xff09; 变量&#xff0c;可以理解为存放某一类型的值的容器&#xff0c;如&#xff1a; var count:Int var shouldRemind:BOOL var text:String var list:[ChecklistItem]一个变量的数据类型&#xff0c;决定了它能存放什么类型的数据。有些…

ODBC更新记录集提示”记录集为只读“

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

gzip格式分析与识别

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

CSS 和 JS 动画哪个更快

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

C语言之分支结构 if(一)

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

react-native安装Ant Design

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

车联网APP,安全设施薄弱的山寨品

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

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"&…

【星榜单】盘点那些坑爹的国产手机们

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

App Tracking Transparency被拒解决

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

ProtoBuf格式详解

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