Swift学习 (四)
5.枚举与结构体:
不必给枚举成员提供一个值。如果我们想要为枚举成员提供一个值(raw value),我们可以用字符串,字符,整型或浮点数类型。
1
2
3
4
5
6
7
|
enum CompassPoint { case North case South case East case West } var directionToHead = CompassPoint.West |
结构体
Struct在Swift中和类有许多相同的地方,可以定义属性,方法,初始化方法,可通过extension扩展等。
不同的地方在于struct是值类型.在传递的过程中都是通过拷贝进行。
在这里要提到在前面第一节处提到了String,Array和Dictionary在Swift是以值类型出现的。这背后的原因就是String,Array,Dictionary在Swift中是通过Struct实现的。而之前在Objective-C它们都是通过class实现的。
Swift中强大的Struct使得我们能够更多与值类型打交道。Swift的值类型增强了不可变性(Immutabiliity)。而不可变性提升了我们代码的稳定性,多线程并发的安全性。
6.协议(Protocols)
protocol SampleProtocol { func someMethod() } |
在Swift遵循协议:
1
2
3
4
|
class AnotherClass: SomeSuperClass, SampleProtocol { func someMethod() {} } |
目前纯Swift的protocol还不支持optional。但根据苹果官方论坛的一位员工的回答,未来Swift是会支持的。
protocol和delegate是紧密联系的。那么我们在Swift中如何定义Delegate呢?
1
2
3
4
5
|
protocol MyDelegate : class { } class MyClass { weak var delegate : MyDelegate? } |
注意到上面的protocol定义后面跟着的class。这意味着该protocol只能被class类型所遵守。
并且只有遵守了class protocol的delegate才能定义为weak。这是因为在Swift中,除了class能够遵守协议,枚举和结构同样能够遵守协议。而枚举和结构是值类型,不存在内存管理的问题。因此只需要class类型的变量声明为weak即可。
利用Swift的optional chaining,我们能够很方便的检查delegate是否为Nil,是否有实现某个方法:
以前我们要在Objective-C这样检查:
1
2
3
|
if (self.dataSource && [self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) { thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index]; } |
在Swift中,非常的优雅简洁。
1
2
|
if let thisSementTitle = dataSource?.titleFroSegmentAtIndex?(index){ } |
新特性:
1.在Swift中,protocol变得更加强大,灵活:
2.class,enum,structure都可以遵守协议。
Extension也能遵守协议。利用它,我们不需要继承,也能够让系统的类也遵循我们的协议。
例如:
1
2
3
4
5
6
7
8
|
protocol myProtocol { func hello() -> String } extension String:myProtocol{ func hello() -> String { return "hello world!" } } |
我们还能够用这个特性来组织我们的代码结构,如下面的代码所示,将UITableViewDataSource的实现移到了Extension。使代码更清晰。
1
2
3
4
|
// MARK: - UITableViewDataSource extension MyViewcontroller: UITableViewDataSource { // table view data source methods } |
3.Protocol Oriented Programming
随着Swift2.0的发布,面向协议编程正式也加入到了Swift的编程范式。Cool.
这种编程方式通过怎样的语法特性支撑的呢?
那就是我们能够对协议进行扩展,也就是我们能够提供协议的默认实现,能够为协议添加新的方法与实现。
用前面的myProtocol为例子,我们在Swift里这样为它提供默认实现。
1
2
3
4
5
|
extension myProtocol{ func hello() -> String { return "hello world!" } } |
我们还能对系统原有的protocol进行扩展,大大增强了我们的想象空间。Swift2.0的实现也有很多地方用extension protocol的形式进行了重构。
7.Swift与Cocoa
一门语言的的强大与否,除了自身优秀的特性外,很大一点还得依靠背后的框架。Swift直接采用苹果公司经营了很久的Cocoa框架。现在我们来看看使用Swift和Cocoa交互一些需要注意的地方。
id与AnyObject
在Swift中,没有id类型,Swift用一个名字叫AnyObject的protocol来代表任意类型的对象。
1
|
id myObject = [[UITableViewCell alloc]init]; |
1
|
var myObject: AnyObject = UITableViewCell() |
我们知道id的类型直到运行时才能被确定,如果我们向一个对象发送一条不能响应的消息,就会导致crash。
我们可以利用Swift的语法特性来防止这样的错误:
1
|
myObject.method?() |
如果myObject没有这个方法,就不会执行,类似检查delegate是否有实现代理方法。
在Swift中,在AnyObject上获取的property都是optional的。
闭包
OC中的block在Swift中无缝地转换为闭包。函数实际上也是一种特殊的闭包。
错误处理
之前OC典型的错误处理步骤:
1
2
3
4
5
6
7
|
NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *URL = [NSURL fileURLWithPath:@ "/path/to/file" ]; NSError *error = nil; BOOL success = [fileManager removeItemAtURL:URL error:&error]; if (!success) { NSLog(@ "Error: %@" , error.domain); } |
在Swift中:
1
2
3
4
5
6
7
|
let fileManager = NSFileManager.defaultManager() let URL = NSURL.fileURLWithPath( "/path/to/file" ) do { try fileManager.removeItemAtURL(URL) } catch let error as NSError { print( "Error: \(error.domain)" ) } |
KVO
Swift支持KVO。但是KVO在Swift,个人觉得是不够优雅的,KVO在Swift只限支持继承NSObject的类,有其局限性。
KVO 在OS X中有Binding的能力,也就是我们能够将两个属性绑定在一起,一个属性变化,另外一个属性也会变化。对与UI和数据的同步更新很有帮助,也是MVVM架构的需求之一。之前已经眼馋这个特性很久了,虽然Swift没有原生带来支持,Swift支持的泛型编程给开源界带来许多新的想法。
Swift学习 (四)的更多相关文章
- iOS ---Swift学习与复习
swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...
- [转]swift 学习资源 大集合
今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...
- swift 学习资源 大集合
今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...
- Swift学习目录
本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...
- Swift学习与复习
swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- 今天开始Swift学习
今天开始Swift学习 在此记录笔记 以备之后查阅! allenhuang
- 12套swift学习资源分享
虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...
- Swift学习笔记七
控制流 Swift提供了和C类似的控制流表达式,包括for.while.if.switch.当然也包括break和continue这种语句来引导控制流到某个指定点的语句. 在C的for基础上,Swif ...
- TweenMax动画库学习(四)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
随机推荐
- Luogu P2148 [SDOI2009]E&D (sg函数 博弈)
题目 洛谷传送门 题解 打表找sgsgsg规律. 严谨证明见:纳尔的博客 CODE #include <bits/stdc++.h> using namespace std; int sg ...
- bootstrap之collapse
<div class="container"> <!--该button可以控制div是否显示 1.首先给button设置data-toggle="col ...
- antd 表单获取参数
wrappedComponentRef是为了把form的值赋值到自定的对象中 <OpenCityForm wrappedComponentRef={(inst)=>{this.cityFo ...
- jsp利用webuploader实现超大文件分片上传、断点续传
1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...
- SPOJ 2939 QTREE5 LCT
维护信息的方式十分巧妙~ 维护每一棵 splay 中深度最浅,深度最深的点距离最近的白点. 这样非常方便维护,进行区间合并,进行子树维护 很多时候在维护东西的时候最大/最小/深度最小/深度最大会相对容 ...
- [GXOI/GZOI2019]特技飞行
题目链接 [https://www.luogu.org/problem/P5302] 思路:这道题可以说是两道题的合并.注意到\(c\)的分数与 \(a\)和\(b\)的分数 无关,也就是说可以分成两 ...
- GitHub中PR(Pull request)操作
1. 贡献代码: 贡献代码,通俗的说,就是自己修改了代码,希望合并到别人的Repository(仓库)中.将自己的智慧贡献给开源社区.下面将详细讲解步骤 1.1 第一步:fork 在GitHub社区闲 ...
- git 文件名大小写不敏感
1. 通过修改 git 配置: git config core.ignorecase false 2. 强制执行修改文件名命令: 需要重命名已添加到git的文件时,git mv --f oldFile ...
- surprise库官方文档分析(一)
一:入门 1.基本用法 (1).自动交叉验证 Surprise有一套内置的 算法和数据集供您使用.在最简单的形式中,只需几行代码即可运行交叉验证程序: from surprise import SVD ...
- java1.8新特性之stream流式算法
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...