2017-08-17 63 views
0

我對於面向協議的編程非常陌生,所以我的問題可能很容易。協議中的方法

我打算定義一個具有clone()方法的Cloneable協議。此方法返回其內容與調用clone()方法的對象內容相同的對象。因此,clone()方法的返回類型必須適應採用Cloneable協議的類。

protocol Cloneable{ 

    func clone() -> AnyObject 
} 


public final class Circle : Cloneable{ 


    private var radius : Double 
    private var area : Double 
    private var perimeter : Double 


    public init(radius : Double){ 
     self.radius = radius 
     area = PI * radius * radius 
     perimeter = 2 * PI * radius 
    } 

    public convenience init(){ 
     self.init(radius : 1.0) 
    } 

    func clone() -> Circle{ 
     return Circle(radius : self.radius) 
    } 
} 

我得到錯誤,說明Class Circle不符合Cloneable協議。 它要我用Circle改變AnyObject。如果我這樣做,那麼這個協議如何用於所有類?

回答

0

改變此密碼 -

func clone() -> Circle{ 
    return Circle(radius : self.radius) 
} 

這個代碼 -

func clone() -> AnyObject { 
    return Circle(radius : self.radius) 
} 
+0

這是非常合理的 – Goktug

+0

這種方法的問題是,你總是要轉換返回值:'讓CIRCLE2 = circle1.clone()as!圓' –

+0

這是通用協議的本質。 –