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

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

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

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

Q&A

解決済

1回答

1337閲覧

コンピューテッドプロパティやプロパティオブザーバの可視化を書き換える

Blue0999

総合スコア148

Swift

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

0グッド

0クリップ

投稿2016/03/24 11:57

以下のコードのスーパークラスのコンピューテッドプロパティやプロパティオブザーバーの可視化をサブクラスで書き換えるという点について確認させてください。
僕の認識ではクラスBの最初のoverrideの意味はこのクラスでは(サブクラスでは)num1をinternalとして扱い値を変更後、文字列"newValue"を出力するという事なのですが合っているでしょうか?
またクラスBの二番目のoverrideはnum2のgetをinternalにし、setをprivateとして参照時1を足してを出力し変更時に変更する値を代入する、でよろしいでしょうか?
それと疑問に思った事があるのですが二番目のoverrideでsetは明示するのになぜgetはinternal(get)と書かないのでしょうか?

長文になってしまい申し訳ありません。回答お待ちしています。
class A {
private var num1 = 1
private var num2 = 2
}

class B: A {
override internal var num1: Int {
didSet {
print("newValue")
}
}
override internal private(set) var num2: Int {
get { return self.num2 + 1 }
set { self.num2 = newValue }
}
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

僕の認識ではクラスBの最初のoverrideの意味はこのクラスでは(サブクラスでは)num1をinternalとして扱い値を変更後、文字列"newValue"を出力するという事なのですが合っているでしょうか?

こちらは認識の通りかと思います。
classAのnum1は同じソースファイルからしかアクセスできませんが、classBのnum1は同じモジュールのソースファイルからアクセス可能です。
classBのnum1に値を設定「B().num1 = 10」とすると"newValue"が呼ばれます。

クラスBの二番目のoverrideはnum2のgetをinternalにし、setをprivateとして参照時1を足してを出力し変更時に変更する値を代入する、でよろしいでしょうか?

こちらも書いてあることは合っていると思います。
しかしこのコードの書き方は実行時にアプリが落ちます。

まずは以下の記事を一読してプロパティの概要を知ることが良いと思います。
Swift ストアドプロパティ(Stored Property) コンピューテッド・プロパティ(Computed Property)

swift

1// 以下の様に b.num2にアクセス時落ちます。 2let b = B() 3print(b.num2) 4 5// こちらはStored Property(自分自身に値を保持します。) 6private var num2 = 2 7 8// こちらはComputed Property(他の変数に対して値の設定、取得をします。) 9// getterの呼び出しが循環してしまって落ちています。 10override internal private(set) var num2: Int { 11 get { return self.num2 + 1 } 12 set { self.num2 = newValue } 13} 14 15// 書き直すのであれば親クラスのnum2に値を設定します。 16override internal private(set) var num2: Int { 17 get { return super.num2 + 1 } 18 set { super.num2 = newValue } 19}

二番目のoverrideでsetは明示するのになぜgetはinternal(get)と書かないのでしょうか?

デフォルトがinternalなので書く必要が無いということです。setterはあえてprivateにしている為に書いています。

投稿2016/03/24 16:03

_Kentarou

総合スコア8490

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

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

Blue0999

2016/03/25 01:45

ご回答ありがとうございます。教えて頂いたページをplaygroundで試しながら読ませていただきました。参考書でわからなかった箇所や不安だった点をを理解することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問