Swift开发实战

Self关键字

2015-09-23  本文已影响136人  sprint

看清楚哦亲,是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方法也能很好的工作。

上一篇下一篇

猜你喜欢

热点阅读