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

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

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

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

Q&A

解決済

2回答

3007閲覧

private extensionとは?使用するメリットがわからない。

atk_721

総合スコア62

Swift

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

0グッド

1クリップ

投稿2020/07/20 02:30

編集2020/07/20 09:49

##HomeController

private extension HomeViewController { func searchBy(naturalLanguageQuery: String, completion: @escaping([MKPlacemark]) -> Void) { var results = [MKPlacemark]() let request = MKLocalSearch.Request() request.naturalLanguageQuery = naturalLanguageQuery request.region = mapView.region let search = MKLocalSearch(request: request) search.start { (response, error) in guard let response = response else { return } response.mapItems.forEach({ (mapItem) in results.append(mapItem.placemark) }) completion(results) } } }

##HomeController LocationInputViewDelegate

extension HomeController: LocationInputViewDelegate { func executeSearch(query: String) { self.searchBy(naturalLanguageQuery: query) { (placeMarks) in self.searchResultPlaceMarks = placeMarks self.tableView.reloadData() } } func dismiss() { self.dismissLocationInputView { (_) in UIView.animate(withDuration: 0.3) { self.inputActivationView.alpha = 1 } } } }

LocationInputView

extension LocationInputView: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { guard let query = textField.text else { return false } delegate?.executeSearch(query: query) return true } }

わからないこと

private extensionが必要になる、または使い所が知りたいです!
調べてみたのですが、理解するには至らずに質問させていただきました。回答お願いします。

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

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

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

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

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

guest

回答2

0

メリットという観点ではわからないのですが、それに関連しそうなところが浮かぶので、あくまでも自分の主観で真偽のほどはわからないのですけれど綴ってみます。

Swift には、公式の API デザインガイドラインという、コードを書くときに心がけたい指針が用意されています。その中で、関数ではなくメソッドで、その機能を主体とするところに所属させるようにする方針が記されています。

型を名前空間として、そこに機能を所属させる。それを実現するために extension が使われる、という側面もあると思っているのですけれど、その機能がそのファイル内からだけ利用できれば良い(アクセスコントロールの目的として、必要ない機能はそれ以上の範囲に公開しない)のであれば fileprivate func でメソッドを定義すれば良くなります。

swift

1// 識別子を生成する過程で `ObjectManager` クラスが一時的に使いたいメソッド 2// 扱う主体が `Object` 型なので、そこに所属させて、関係性を明瞭にする 3extension Object { 4 5 fileprivate func idStringForKeyPart() -> String { 6 } 7 8 fileprivate func idStringForValuePart() -> String { 9 } 10} 11 12class ObjectManager { 13 14 var key: Object 15 var value: Object 16 17 // このメソッドだけ、外から利用できれば良い 18 func objectIdentifier() -> String { 19 20 return "(key.idStringForKeyPart):(value.idStringForValuePart)" 21 } 22}

そしてそれらが複数のまとまりで存在していたときに private extension を使って明示的にグループにまとめて主体に所属させる、みたいな使い方もできそうです。

swift

1// 識別子を生成する過程で `ObjectManager` クラスが一時的に使いたいメソッド 2// 扱う主体が `Object` 型なので、そこに所属させて、関係性を明瞭にする 3private extension Object { 4 5 func idStringForKeyPart() -> String { 6 } 7 8 func idStringForValuePart() -> String { 9 } 10} 11 12class ObjectManager { 13 14 var key: Object 15 var value: Object 16 17 // このメソッドだけ、外から利用できれば良い 18 func objectIdentifier() -> String { 19 20 return "(key.idStringForKeyPart):(value.idStringForValuePart)" 21 } 22}

投稿2020/07/22 18:23

TomohiroKumagai

総合スコア441

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

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

atk_721

2020/07/25 04:34

回答ありがとうございます!関数ではなくメソッドで、その機能を主体とするところに所属させるようにする方針があるということ知らなかったので勉強になりました!複数のまとまりで存在していたときに private extension を使って明示的にグループにまとめて主体に所属させる。という理解で納得できました!
guest

0

自己解決

調べてみましたがよくわかりませんでした。
自分で考えてみたのですが、HomeControllerはMapKitをimportしているので,MapKitの持つプロパティーにアクセスさせない為にPrivateにExtensionしているという結論に至りました。

投稿2020/07/22 14:44

atk_721

総合スコア62

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問