日々精進

新しく学んだことを書き留めていきます

swift

swiftでUIViewControllerのサブクラスでsuper.init()をcallすると「Must call a designated initializer of the superclass 'UIViewController'」エラー

UIViewControllerのdesignated initializerは「initWithNibName:bundle:」なのでこれをcallしないといけない。 Xibから読み込みたくない場合はnilを渡せばいい。以下のような感じ。 init() { super.init(nibName: nil, bundle: nil) }参考:ios - Why can't …

swiftでのメソッドコメントは@paramでなく、:param:のように書く

ObjCでのメソッドコメントは@param fooのように書いていたが、swiftでは:param:のように書くとXCodeがアノテーションとして認識してくれるらしい。 XCode6にはreStructuredTextというMarkDownのような記法のパーサが含まれているらしいけど、reStructuredTex…

swiftのstructはallocated inlineなので速いらしい

mikeash.com: Friday Q&A 2014-06-20: Interesting Swift Featuresに書いてあったんだけど、「As a bonus, it should be more efficient as well, since structs can potentially be allocated inline rather than requiring allocation on the heap.」らし…

ObjCで定義したクラスを継承したクラスをswiftで定義した時に、インスタンスがswiftで定義したクラスの型にならない場合がある

hosokawa0825/THLoadXibView · GitHubを使ってswiftでViewクラスを定義した。 継承構造は以下。 UIView > THLoadXibView > MySwiftView ObjC側コードで以下のようにしてMySwiftViewインスタンスを作ると、実行時型もMySwiftViewになる。 MySwiftView *v = [[…

swiftで定義したクラスに自動的にPrefixが付くのを防ぐ

実行環境:XCode6-Beta4 swiftで定義したクラスには実行時に以下のルールでPrefixが付く。 _TtC<targetNameのutf16count><targetName><クラス名の文字数><クラス名>なので、THClassはNSStringFromClassでクラス名を文字列にすると_TtC5TName6THClass…

swiftで定義したクラス名は自動的に実行時にPrefixが付く

今やってるプロジェクトでは以下の規約を使っている。 ・Viewクラスとそれに対応するXIBファイルは同じ名前にする ・Viewクラスのインスタンスを作る時にXIBファイル名を指定しなければViewクラスと同じ名前のXIBからインスタンスを作る しかし、swiftで定義…

super.initをイニシャライザで呼ぶと「property not initialized at super.init call」エラー

エラーメッセージの通り、super.initを呼ぶ前にすべてのプロパティを初期化してないといけない。 でもsuper.initしないとbaseクラスのメソッドが使えないので、UIViewControllerのサブクラスのイニシャライザは以下のようになる。 init() { self.homeViewCon…

delegateにオブジェクトを代入すると「Cannot assign to the result of this expression」エラー

以下のように、delegateに代入するとエラーになる。 self.urlDownloader?.delegate = self以下のようにunwrapすると直る。 self.urlDownloader!.delegate = self以下のサイトの記事ではこの原因は「self.urlDownloader?を評価した結果、nilになることがある…

Objcで定義したクラスをswiftで使おうとすると「use of undeclared type・・・」エラー

Objcで定義したクラスをswiftで使う場合、Bridging-Header.hにimport文を書かないといけない。 それは書いているのだが、なぜか以下のようにIBOutletの型として定義しているところで「use of undeclared type・・・」エラーが発生し困った。 @IBOutlet var t…