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

原创 2016年05月14日 23:11:06

简要

协议是苹果给它自己设计的语言的一种类型,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开发经验的同学应该知道怎么用了,其他方面都是一些语法糖,像协议的合成,类类型专属协议,可选的协议要求,我们看一下就知道,协议的继承跟类的继承是一样的,用冒号分开,很简单。

相关文章推荐

Swift3.0- 协议(protocol)

Swift3.0- 协议(protocol)代理,委托 /* * Protocol协议 (接口Interface或者纯虚函数) 协议用于统一方法和属性的名称,而不实现任何功能(使用代理设计模式...

Swift 协议(Protocols)

协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必需的方法和属性。类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。任意能够满足协议要求的类型被称为遵循(confo...

判断目录是否存在并创建mkdir

Linux下mkdir函数 头文件库:   #include   #include     函数原型:   int mkdir(const c...

在移动跨平台框架PhoneGap中的异步体验

Wind.js  最近正在做一个移动跨平台项目的应用开发,包括在iphone,ipad,android,windows phone等手机设备中运行混合式客户端应用程序,这里选择了PhoneGap的移...
  • dj0379
  • dj0379
  • 2016年01月05日 01:52
  • 611

Swift 协议(Protocols)

协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必需的方法和属性。类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。任意能够满足协议要求的类型被称为遵循(confo...

Swift协议(Protocols)

协议主要为一个特定的任务和功能定义一个方法、属性和其他要求,你也可以理解协议就是一种要遵循的规范。学过设计模式的,都知道工厂模式,如果你不知道可以查阅我的博文《23设计模式之工厂方法(FactoryM...

Introducing Swift - Protocols

Introducing Swift - Protocols协议语法// 定义 protocol SomeProtocol { // something ... }// 使用 class So...
  • hhcncx
  • hhcncx
  • 2016年08月17日 16:17
  • 140

寒城攻略:Listo 教你 25 天学会 Swift 语言 - 23 Protocols

//*********************************************************************************************** ...

寒城攻略:Listo 教你 25 天学会 Swift 语言 - 23 Protocols

import Foundation //***********************************************************************...

protocols 协议

协议 协议用于声明一些方法,这些方法有其他任何(遵循协议的)类来实现。它主要用于一下三种情形: 1.声明一些其他类期望实现的方法; 2.为需要隐藏自身的对象定义接口; 3.在没有继承相关性的对...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对照Java学习Swift--协议(Protocols)
举报原因:
原因补充:

(最多只允许输入30个字)