• 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支持的泛型编程给开源界带来许多新的想法。

  • 相关阅读:
    字符串内部查找函数
    vs2005 编译zlib 1.2.3 小记
    ies4linux 安装
    详述IP数据包的转发流程
    看源代码
    091213
    值得你记住并受用一生的Word XP/2003快捷键
    java开源框架的源代码怎么读?
    excel中的EMBED域介绍
    如何用c语言实现CString的构造函数、析构函数和赋值函数?
  • 原文地址:https://www.cnblogs.com/pengsi/p/5128791.html
Copyright © 2020-2023  润新知