Self关键字

作者: sprint | 来源:发表于2015-09-23 14:35 被阅读136次

    看清楚哦亲,是Self不是self

    直接上代码:

    protocol IntervalType {

        func clamp(intervalToClmap:Self) -> Self

    }

    这是什么鬼?

    这么定义是因为我们不知道 未来谁要来实现IntervalType,而参数和返回类型不能写上具体值,

    有同学说可以用IntervalType啊,是啊没错但是你调用时是不是得类型转换。。。。

    如果我们希望在接口使用时的类型就是实现该接口本身的类型的话,就需要用Self进行指代

    但是在这种情况下,Self不仅指代的是实现该接口的类型本身,也包括了这个类型的子类。

    例如:

    protocol Copyable {

       func copy() -> Self

    }

    class MyClass : Copyable {

        func copy() -> Self { //这时候Self代表MyClass

           //但是这里我们该怎么写呢?return ?

        }

    }

    你可能会写出这样的代码?

    class MyClass : Copyable { 

          func copy() -> Self {

          return MyClass()

          }

    }

    你会得到一个编译时错误,因为该方法要求我们返回一个抽象的表示当前类型的Self,但是我们却返回了它的真实类型MyClass, 也许你觉得我们可以把方法的返回值Self改为MyClass,很快你又发现实现的方法和接口中的定义不一致,依然不能编译。

    为了解决这个问题我们需要通过一个和上下文无关的,又能指代当前类型的方式初始化,那就是dynamicType.

    func copy() -> Self {

      let copyResult = self.dynamicType.init()

    return copyResult

    }

    而对于MyClass的子类 即使不重写copy方法也能很好的工作。

    相关文章

      网友评论

        本文标题:Self关键字

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