質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1548閲覧

Swift2への書き換えがうまくいきません。

ivysystemdesign

総合スコア17

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2015/10/02 17:35

swiftを勉強中なのですが、サンプルプログラムがswift1.2(?)で描かれているので自分の環境であるswift2に書き換えて実行したいと思っているのですが、どうしても自分では対応できないエラーが発生しまったので教えていただきたいです。

サンプルプログラムが公開されているページ:http://dev.classmethod.jp/smartphone/iphone/swift-ios8-cikernel/

上記のプログラムを自分なりに2.0でも動くように変更したのですが、2箇所で「Property 'self.kernel' not initialized at super.init call」というエラーが出てきてしまいました。

import CoreImage
class CustomFilter: CIFilter {

var kernel: CIKernel var inputImage: CIImage? override init() { super.init() // エラー発生 self.kernel = createKernel() } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)! // エラー発生 self.kernel = createKernel() } func outputImg() -> CIImage? { if let inputImage = self.inputImage { let args = [inputImage as AnyObject] let dod = inputImage.extent.insetBy(dx: -1, dy: -1) return kernel.applyWithExtent(dod, roiCallback: { (index, rect) in return rect.insetBy(dx: -1, dy: -1) }, arguments: args) } return nil } private func createKernel() -> CIKernel { let kernelString = "kernel vec4 RGB_to_GBR(sampler source_image)\n" + "{\n" + "vec4 originalColor, twistedColor;\n" + "originalColor = sample(source_image, samplerCoord(source_image));\n" + "twistedColor.r = originalColor.g;\n" + "twistedColor.g = originalColor.b;\n" + "twistedColor.b = originalColor.r ;\n" + "twistedColor.a = originalColor.a;\n" + "return twistedColor;\n" + "}\n" return CIKernel(string: kernelString)! }

}

このエラーについては、ここで解説されていたのですが、今回の場合の具体的対処方法がわからずにいます…
もし対処方法がわかる方がおられましたらおしえていただけないでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CIKernelのinitializerがオプショナルを返すように変更になったのでプロパティーをvar kernel: CIKernel?のようにオプショナルに変更してみました。

これがオプショナルでないとkernel変数がnilを許容しないので、super.init()の時点で初期化されてませんよというエラーが出てしまっています。

Swift

1import CoreImage 2class CustomFilter: CIFilter { 3 4 var kernel: CIKernel? 5 var inputImage: CIImage? 6 7 override init() { 8 super.init() 9 self.kernel = createKernel() 10 } 11 12 required init(coder aDecoder: NSCoder) { 13 super.init(coder: aDecoder)! 14 self.kernel = createKernel() 15 } 16 17 func outputImg() -> CIImage? { 18 if let inputImage = self.inputImage { 19 let args = [inputImage as AnyObject] 20 let dod = inputImage.extent.insetBy(dx: -1, dy: -1) 21 return kernel!.applyWithExtent(dod, roiCallback: { 22 (index, rect) in 23 return rect.insetBy(dx: -1, dy: -1) 24 }, arguments: args) 25 } 26 return nil 27 } 28 29 private func createKernel() -> CIKernel { 30 let kernelString = 31 "kernel vec4 RGB_to_GBR(sampler source_image)\n" + 32 "{\n" + 33 "vec4 originalColor, twistedColor;\n" + 34 "originalColor = sample(source_image, samplerCoord(source_image));\n" + 35 "twistedColor.r = originalColor.g;\n" + 36 "twistedColor.g = originalColor.b;\n" + 37 "twistedColor.b = originalColor.r ;\n" + 38 "twistedColor.a = originalColor.a;\n" + 39 "return twistedColor;\n" + 40 "}\n" 41 42 return CIKernel(string: kernelString)! 43 } 44}

投稿2015/10/02 17:58

jollyjoester

総合スコア1585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ivysystemdesign

2015/10/03 02:06

ありがとうございました!無事ビルドできました!! エラーの具体的な理由も教えていただき助かりました。今後に活かしていきたいと思います。 本当に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問