NSObjectのinit()について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,967
NSObjectの派生クラスは、UIView()やUIViewController()のようにすると初期化することができますよね?
この引数のないinit()はNSObjectで定義された指定イニシャライザのようですが、このinit()がどういう仕組みになってるのかいまいち理解できません。
class SubUIView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
print(frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
SubUIView()
Playgroundで上のように記述すると、initWithFrame:のprint文が出力され、init()からinitWithFrame:が呼び出されてるように見えます。
つまりこれは、UIViewはNSObjectのinit()を簡易イニシャライザとしてオーバーライドして、間接的に自身の指定イニシャライザを呼び出してるということでしょうか?
他のNSObject派生クラスでも「クラス名()」で初期化できるものは、「init()を簡易イニシャライザとしてオーバーライドして、間接的に自身の指定イニシャライザを呼び出してる。」という解釈であってますでしょうか?
書いてるうちにややこしくなってしまって、申し訳ないのですが回答よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
UIView()やUIViewController()と書いて初期化されるのでは、Swift言語の仕様です。
また、init()はイニシャライザであり、関数でもメソッドでもありません。これもSwift言語で定義されています。
NSObjectクラスを継承しているかどうかは関係ありません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/17 15:00
init()がイニシャライザであることは理解しています。
Swift言語の仕様とのことですが、デフォルトイニシャライザとは別なのでしょうか?
また、init()をクイックヘルプで見るとNSObjectがリファレンスとして表示されるのですが、それでもNSObjectとは関係ないのでしょうか?
2016/04/17 15:13
2016/04/17 19:17
ただ例のコードであげたように、SubUIView()と記述すると、initWithFrame:も呼び出されるのはなぜですか?
度々ですみません。
2016/04/17 19:32
2016/04/17 23:45
恐縮ながら、私はObjective-Cをほぼ触ったことがないので、初心者にもわかるように教えていただけるとありがたいです。よろしくお願いします。
2016/04/18 00:29
だから、基本的にSwiftからはObjective-Cのメソッドは呼べません。
しかし、SwiftにはObjective-Cのクラスやメソッドを扱うための、特別な機能があります。
これにより、Swiftのクラスやメソッドが(暗黙的に)Objective-Cのクラスやメソッドに変換されます。
逆に、Objective-Cのクラスやメソッドは、Swiftのクラスやメソッドとして定義し直されます。
2016/04/18 20:45
ただ先ほどお聞きしたのですが、SubUIView()の用に引数のないinit()から、init(frame: CGRect)のような引数のあるイニシャライザが呼ばれる理由がいまだにわかりません。
もう少し正確に言うと、「UIViewを引数なしの作成した場合、UIView(frame:CGRectZero)で作成したことになる。」ようなんですが、これはなぜなんでしょうか?
先ほどは「Swiftのinit(frame: CGRect)が、Objective-CのinitWithFrame:にマッピングされるからです。」とお答えいただきましたが、init()からinit(frame: CGRect)が呼ばれる理由としては、私は理解できませんでした。
2016/04/18 21:18
- (instancetype)init {
return [self initWithFrame: CGRectZero];
}
と書いてあるからです。
2016/04/19 19:43
長いこと付き合っていただきありがとうございました!