谁与争锋的专栏

循序渐进才能赢得时间,细水长流才能直达永恒

对照Java学习Swift--协议(Protocols)

简要

协议是苹果给它自己设计的语言的一种类型,Swift和OC都叫协议,它的功能更Java中的接口非常类似,其实就是Java中的接口功能,就是名称不一样而已,我们可以类比来学,但是有一点,Java中没有扩展,所以Java中的接口也是不可以扩展的,但是Swift可以。

协议语法

协议使用protocol关键字来定义:

protocol SomeProtocol {
    // 这里是协议的定义部分
}

Java中的接口使用interface关键字来定义:

public interface SomeInterface {

}

Swift中类、结构体或枚举都可以采纳协议,需要在类型名称后加上协议名称,中间以冒号(:)分隔,采纳多个协议时,各协议之间用逗号(,)分隔。Java中,只有类能够实现接口,类型名称后加上接口名称,中间以implements关键字分隔,我们看下例子:
Swift:

class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 这里是类的定义部分
}

Java:

public class SomeObject implements SomeInterface,SomeInterface1 {
    // 这里是类的定义部分
}

属性要求

协议要求采纳协议的类型提供特定名称和类型的实例属性或类型属性。协议本身不指定属性是存储型属性还是计算型属性,它只指定属性的名称和类型,具体是哪种类型由采纳协议的类型自己去确定,此外,协议还指定属性是可读的还是可读可写的。

如果协议要求属性是可读可写的,那么该属性不能是常量属性或只读的计算型属性。如果协议只要求属性是可读的,那么该属性不仅可以是可读的,如果代码需要的话,还可以是可写的。
协议总是用 var 关键字来声明变量属性,在类型声明后加上 { set get } 来表示属性是可读可写的,可读属性则用 { get } 来表示:

protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

在协议中定义类型属性时,总是使用 static 关键字作为前缀。当类类型采纳协议时,除了 static 关键字,还可以使用 class 关键字来声明类型属性:

protocol AnotherProtocol {
    static var someTypeProperty: Int { get set }
}

Java中没有属性这个概念,类似于Swift的属性有个字段的概念,一般来说字段是private的,接口中不允许使用私有的字段,不过可以在接口中定义一些静态公共的常量,即用public static final修饰的字段。

方法要求

协议可以要求采纳协议的类型实现某些指定的实例方法或类方法。这些方法作为协议的一部分,像普通方法一样放在协议的定义中,但是不需要大括号和方法体。可以在协议中定义具有可变参数的方法,和普通方法的定义方式相同。但是,不支持为协议中的方法的参数提供默认值。

正如属性要求中所述,在协议中定义类方法的时候,总是使用 static 关键字作为前缀。当类类型采纳协议时,除了 static 关键字,还可以使用 class 关键字作为前缀:

protocol SomeProtocol {
    static func someTypeMethod()
}

下面的例子定义了一个只含有一个实例方法的协议:

protocol RandomNumberGenerator {
    func random() -> Double
}

Java8以下的版本中,接口中不允许有方法的实现,但是在Java8及其以上的版本中,接口可以有方法的实现,Swift不允许在协议中有方法的实现,必须为空方法,但是可以在扩展中提供默认方法的实现,在采纳协议的类型中,可以直接调用。
协议可以当做像Swift中其他类型来使用了,有Java开发经验的同学应该知道怎么用了,其他方面都是一些语法糖,像协议的合成,类类型专属协议,可选的协议要求,我们看一下就知道,协议的继承跟类的继承是一样的,用冒号分开,很简单。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovexieyuan520/article/details/51412273
个人分类: swift
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭