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学习 (四)的更多相关文章

  1. iOS ---Swift学习与复习

    swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...

  2. [转]swift 学习资源 大集合

    今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...

  3. swift 学习资源 大集合

    今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...

  4. Swift学习目录

    本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...

  5. Swift学习与复习

    swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...

  6. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  7. 今天开始Swift学习

    今天开始Swift学习  在此记录笔记  以备之后查阅! allenhuang

  8. 12套swift学习资源分享

    虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...

  9. Swift学习笔记七

    控制流 Swift提供了和C类似的控制流表达式,包括for.while.if.switch.当然也包括break和continue这种语句来引导控制流到某个指定点的语句. 在C的for基础上,Swif ...

  10. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

随机推荐

  1. 优化你的HTTPS(上),你需要这么做

    HTTP/2 HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小 ...

  2. Java8新特性--CompletableFuture

    并发与并行 Java 5并发库主要关注于异步任务的处理,它采用了这样一种模式,producer线程创建任务并且利用阻塞队列将其传递给任务的consumer.这种模型在Java 7和8中进一步发展,并且 ...

  3. Django2-settings常用配置

    1. MySQL 数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bms', # 要连接 ...

  4. 判断变量是否不为空,函数isset()、!empty()与!is_null()的比较

    转载:https://blog.csdn.net/qq_38812954/article/details/79581785 判断变量的值,尤其是判断他们是否不为空,我们有以下4种方法: if(isse ...

  5. POJ-2065-SETI(高斯消元)

    链接: https://vjudge.net/problem/POJ-2065 题意: For some years, quite a lot of work has been put into li ...

  6. javascript权威指南第14章 表单脚本示例代码

    HTML部分 <!DOCTYPE html> <html> <head> <title></title> </head> < ...

  7. Appium自动化测试教程-自学网-monkey自定义脚本实践

    自定义脚本的稳定性测试 常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Mon ...

  8. leetcode解题报告(14):Max Consecutive Ones

    描述 Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: ...

  9. Codeforces Round #591

    目录 Contest Info Solutions A. Save the Nature B. Sequence Sorting C. Paint the Tree D. Stack Extermin ...

  10. Kalman实际应用总结

    目录 Kalman理论介绍 一. 简单理论介绍理论 二. 升华理论介绍 Kalman基本应用 一. Kalman跟踪/滤波 二. Kalman预测/融合(单传感器) 三. Kalman多传感器融合A ...