2014-08-29 198 views
3

我試圖按照以下步驟創建的CIFilter一個子類子類CIFilter:在斯威夫特

class ColorMonochromeFilter: CIFilter { 

    required init(red: CGFloat!, green: CGFloat!, blue: CGFloat!) { 

     super.init(name: "ColorMonochrome") 
     setDefaults() 

     let colour = UIColor(red: red, green: green, blue: blue, alpha: 1.0) 
     setValue(colour, forKey: kCIInputColorKey) 
    } 
} 

我收到以下錯誤信息:

  1. 班「ColorMonochromeFilter」不實現其超類的 必需成員
  2. 必須調用 超類「CIFilter」的指定初始值設定項

看來,指定初始化劑是init(coder aDecoder: NSCoder!)由於CIFilter符合NSCoding協議,而不是init(name: String!)其在上CIFilter擴展聲明。

我可以通過添加刪除第一個錯誤:

required init(coder aDecoder: NSCoder!) { 
     super.init(coder: aDecoder) 
    } 

(儘管這似乎有點多餘!)

有沒有解決的第二個問題的方法嗎?


我想在這裏實現的是這樣做的雨燕相當於:

@implementation ASHColorMonochromeFilter 

    + (ASHColorMonochromeFilter *) filterWithRed: (CGFloat) red green:(CGFloat)green blue:(CGFloat)blue 
    { 
     ASHColorMonochromeFilter * filter = (ASHColorMonochromeFilter *)[ASHColorMonochromeFilter filterWithName: @"CIColorMonochrome"]; 

     UIColor * color = [UIColor colorWithRed: red green: green blue: blue alpha: 1.0]; 
     [filter setValue: color forKey: kCIImageColorSpace]; 

     return filter; 
    } 
+0

你真的想繼承CIFilter以添加/覆蓋方法,或者你只需​​要一個額外的初始化器? – 2014-08-29 18:12:44

+0

那麼,在這種情況下,我想了解如何實現上述目標,如果可能的話 - 或者我的知識存在差距。 – 2014-08-29 19:35:33

+0

我不是這方面的專家,但據我瞭解,'init(name:「ColorMonochrome」)'加載了一個預定義的過濾器,所以子類化可能沒有意義。在一個子類中,你只需要調用'super.init()'。 - 如果您只需要ColorMonochrome過濾器的附加初始化程序,那麼您可以定義一個擴展。 (我已經用一個例子準備了答案,但我不確定這是否是您需要的。) – 2014-08-29 19:39:25

回答

3

你的Objective-C類方法

+ (ASHColorMonochromeFilter *) filterWithRed: (CGFloat) red green:(CGFloat)green blue:(CGFloat)blue 

實際回報(一個子類的實例)的CIFilter。同樣可以在斯威夫特實現 與便利初始化

extension CIFilter { 
    convenience init(red: CGFloat, green: CGFloat, blue: CGFloat) { 
     self.init(name:"CIColorMonochrome") 
     setDefaults() 
     let colour = UIColor(red: red, green: green, blue: blue, alpha: 1.0) 
     setValue(colour, forKey: kCIInputColorKey) 
    } 
} 

將其稱作

let filter = CIFilter(red: 0.1, green: 0.2, blue: 0.3) 
+0

好吧,那很好,但如果我真的*想*會發生什麼情況返回一個子類?有額外的屬性,說?在這種情況下,Swift似乎比Objective-C更難......或者我錯過了什麼? – 2014-08-30 09:22:28

+0

@AshleyMills:那麼你只需要在你的子類初始化器中調用super.init()。 - 即使在ObjC中,'[ASHColorMonochromeFilter filterWithName:...''不*返回ASHColorMonochromeFilter類的實例。 – 2014-08-30 09:26:36

+0

還有問題 - 超類('CIFilter')本身沒有指定的初始化程序本身,而是通過採用NSCoding' init(coder:aDecoder)'。所以可以調用'super.init(coder:nil)'? – 2014-08-30 10:30:32