美文网首页
协议的构造函数

协议的构造函数

作者: peerben | 来源:发表于2016-03-15 10:24 被阅读20次

楼主定义了一个泛型函数,但是报错了:
func sign<T> (value:T) -> T {
if value < 0.0 { // error: Binary operator '<' cannot be applied to operands of type 'T' and 'Double'
return -1.0
}
if value > 0.0 {
return 1.0
}
return 0.0
}
问题解答
此问题对于看过 Swift 官方文档的同学来讲,简直是小菜一碟,这个问题感觉可以作为一个面试题,如果回答不出来,就不要在 Swift 程序界混了吧:
import UIKit

protocol MyFloats : Comparable {
    init(_ value: Double)
}

extension Double : MyFloats { }
extension Float : MyFloats { }
extension CGFloat : MyFloats { }

func sign<T: MyFloats> (value:T) -> T {
    if value < T(0.0) {
        return T(-1.0)
    }
    if value > T(0.0) {
        return T(1.0)
    }
    return T(0.0)
}

回顾了一下协议对构造函数的要求
对构造器的规定

协议可以要求它的遵循类型实现特定的构造器。你可以像书写普通的构造器那样,在协议的定义里写下构造器的需求,但不需要写花括号和构造器的实体:

protocol SomeProtocol {
    init(someParameter: Int)
}

协议构造器规定在类中的实现

你可以在遵循该协议的类中实现构造器,并指定其为类的特定构造器或者便捷构造器。在这两种情况下,你都必须给构造器实现标上"required"修饰符:

class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        //构造器实现
    }
}

使用required修饰符可以保证:所有的遵循该协议的子类,同样能为构造器规定提供一个显式的实现或继承实现。

关于required构造器的更多内容,请参考required构造器

注意

如果类已经被“final”修饰符所标示,你就不需要在协议构造器规定的实现中使用"required"修饰符。因为final类不能有子类。关于final修饰符的更多内容,请参见防止重写
如果一个子类重写了父类的指定构造器,并且该构造器遵循了某个协议的规定,那么该构造器的实现需要被同时标示required和override修饰符

protocol SomeProtocol {
    init()
}


class SomeSuperClass {
    init() {
        //协议定义
    }
}


class SomeSubClass: SomeSuperClass, SomeProtocol {
    // "required" from SomeProtocol conformance; "override" from SomeSuperClass
    required override init() {
        // 构造器实现
    }
}

可失败构造器的规定

可以通过给协议Protocols中添加可失败构造器来使遵循该协议的类型必须实现该可失败构造器。

如果在协议中定义一个可失败构造器,则在遵顼该协议的类型中必须添加同名同参数的可失败构造器或非可失败构造器。 如果在协议中定义一个非可失败构造器,则在遵循该协议的类型中必须添加同名同参数的非可失败构造器或隐式解析类型的可失败构造器(init!)。

这里如果是类实现了协议的构造器,一定要加上required修饰符。

这里extension Double : MyFloats { },Double是struct类型,不需要用required修饰

相关文章

  • 协议的构造函数

    楼主定义了一个泛型函数,但是报错了:func sign (value:T) -> T {if value <...

  • Swift 2 学习笔记 18.协议

    课程来自慕课网liuyubobobo老师 协议 协议基础 协议和构造函数 为什么要用协议 类型别名(typeali...

  • store模块阅读22:HA(1):HAConnection

    简介 部分涉及HAService的代码后面再讲 master和slave同步数据的协议如下 属性 函数 构造函数和...

  • C# 构造函数总结

    构造函数 构造函数分为:实例构造函数,静态构造函数,私有构造函数。 实例构造函数 1、构造函数的名字与类名相同。 ...

  • Flutter 6种构造函数详解

    Flutter有生成构造函数、默认构造函数、命名构造函数、重定向构造函数、常量构造函数、工厂构造函数 一.生成构造...

  • Swift基础语法-类的构造函数

    本节知识点 构造函数的介绍 构造函数的基本使用 自定义构造函数 属性与构造函数 1. 构造函数的介绍 构造函数类似...

  • C++:面向对象基础

    构造函数 C++中有三种构造函数:默认构造函数,有参构造函数,拷贝构造函数 类对象的初始化 括号法//默认构造函数...

  • Javascript 基础之原型链

    构造函数、构造函数实例、构造函数原型 function Student (name) { } - 这是构造函数va...

  • 构造函数

    构造函数分为: 1.实例构造函数 2.私有构造函数 3.静态构造函数 私有构造函数 私有构造函数是一种特殊的实例构...

  • Kotlin面向对象 (3)✔️构造函数

    主构造函数次构造函数默认构造函数 kotlin中的构造函数有主次之分,主构造函数只能有一个,此构造函数可以有多个。...

网友评论

      本文标题:协议的构造函数

      本文链接:https://www.haomeiwen.com/subject/xzzflttx.html