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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

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

Q&A

解決済

1回答

3886閲覧

NSObjectのinit()について

monokuro

総合スコア33

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

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

0グッド

0クリップ

投稿2016/04/17 03:27

NSObjectの派生クラスは、UIView()やUIViewController()のようにすると初期化することができますよね?

この引数のないinit()はNSObjectで定義された指定イニシャライザのようですが、このinit()がどういう仕組みになってるのかいまいち理解できません。

lang

1class SubUIView: UIView { 2 override init(frame: CGRect) { 3 super.init(frame: frame) 4 print(frame) 5 } 6 7 required init?(coder aDecoder: NSCoder) { 8 fatalError("init(coder:) has not been implemented") 9 } 10} 11 12SubUIView()

Playgroundで上のように記述すると、initWithFrame:のprint文が出力され、init()からinitWithFrame:が呼び出されてるように見えます。

つまりこれは、UIViewはNSObjectのinit()を簡易イニシャライザとしてオーバーライドして、間接的に自身の指定イニシャライザを呼び出してるということでしょうか?

他のNSObject派生クラスでも「クラス名()」で初期化できるものは、「init()を簡易イニシャライザとしてオーバーライドして、間接的に自身の指定イニシャライザを呼び出してる。」という解釈であってますでしょうか?

書いてるうちにややこしくなってしまって、申し訳ないのですが回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

UIView()やUIViewController()と書いて初期化されるのでは、Swift言語の仕様です。
また、init()はイニシャライザであり、関数でもメソッドでもありません。これもSwift言語で定義されています。
NSObjectクラスを継承しているかどうかは関係ありません。

投稿2016/04/17 05:04

Stripe

総合スコア2183

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

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

monokuro

2016/04/17 06:00

いつも回答ありがとうございます。 init()がイニシャライザであることは理解しています。 Swift言語の仕様とのことですが、デフォルトイニシャライザとは別なのでしょうか? また、init()をクイックヘルプで見るとNSObjectがリファレンスとして表示されるのですが、それでもNSObjectとは関係ないのでしょうか?
Stripe

2016/04/17 06:13

NSObjectを継承すると、Swift言語のObjective-Cブリッジ機能が働いて、init()がNSObjectのinitメソッドにマッピングされます。
monokuro

2016/04/17 10:17

ブリッジ機能など、今の私ではいまいち理解できませんが、UIView()のように書いて初期化されるのはSwiftの仕様ということはわかりました。 ただ例のコードであげたように、SubUIView()と記述すると、initWithFrame:も呼び出されるのはなぜですか? 度々ですみません。
Stripe

2016/04/17 10:32

Swiftのinit(frame: CGRect)が、Objective-CのinitWithFrame:にマッピングされるからです。
monokuro

2016/04/17 14:45

しつこくて申し訳ないのですが、ブリッジやマッピングとは何なのかもう少し詳しく説明していただけませんか? 恐縮ながら、私はObjective-Cをほぼ触ったことがないので、初心者にもわかるように教えていただけるとありがたいです。よろしくお願いします。
Stripe

2016/04/17 15:29

基本的に、SwiftとObjective-Cは異なる言語で、クラス・関数・メソッド等などに互換性がありません。 だから、基本的にSwiftからはObjective-Cのメソッドは呼べません。 しかし、SwiftにはObjective-Cのクラスやメソッドを扱うための、特別な機能があります。 これにより、Swiftのクラスやメソッドが(暗黙的に)Objective-Cのクラスやメソッドに変換されます。 逆に、Objective-Cのクラスやメソッドは、Swiftのクラスやメソッドとして定義し直されます。
monokuro

2016/04/18 11:45

なるほど、詳しく解説していただきありがとうございます。 ただ先ほどお聞きしたのですが、SubUIView()の用に引数のないinit()から、init(frame: CGRect)のような引数のあるイニシャライザが呼ばれる理由がいまだにわかりません。 もう少し正確に言うと、「UIViewを引数なしの作成した場合、UIView(frame:CGRectZero)で作成したことになる。」ようなんですが、これはなぜなんでしょうか? 先ほどは「Swiftのinit(frame: CGRect)が、Objective-CのinitWithFrame:にマッピングされるからです。」とお答えいただきましたが、init()からinit(frame: CGRect)が呼ばれる理由としては、私は理解できませんでした。
Stripe

2016/04/18 12:18

それは、UIViewクラスにの中に - (instancetype)init { return [self initWithFrame: CGRectZero]; } と書いてあるからです。
monokuro

2016/04/19 10:43

なるほど。完璧ではないですが、ぼんやりとわかりました。 長いこと付き合っていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問