2016-04-26 15 views
0

Javaのような他の言語を学んでいたときには、すべてのサンプルコードで常にフィールドprivateをマークする必要があることがわかりました。内部の処理を行うメソッドには、privateまたはprotectedとマークされています。Swiftのカプセル化は他のオブジェクト指向言語のように重要です

しかし、Swiftに関しては、たくさんのチュートリアル(raywenderlich.comなど)のサンプルコードでは、まったくprivateとマークすることがあります。彼らはそれをそのままinternalのままにします(修飾子は一切加えません)。

対照的に、すべてのアンドロイドチュートリアルでは、フィールドの一部をprivateとマークし、ゲッターやセッターを提供していません。

例えば、私はしばらく前に、この検索バーのチュートリアルをお読みください。

https://www.raywenderlich.com/113772/uisearchcontroller-tutorial

私はそれを読んでいた、私が考えていた。「なぜ、あなたはこのprivateをマークしていませんでした?」私が意味する

let searchController = UISearchController(searchResultsController: nil) 

他のクラスが VCの検索コントローラにアクセスするために、それは意味がありません。それは鉱山です!

質問:いないすべてのチュートリアルがプライベートプロパティが含まれているサンプルコードを提供する場合

はなぜ、ほとんどないのですか?それはiOSがより安全なものか何かですか?プロダクションコードではプライベートなものとしてマークする必要がありますか?

私はこれも意見に基づいていないことを望みます。 Javaでは、フィールドを公開することはありません。それは単なる事実です。フィールドを公開するべきではありません。ですから、意見に基づいて閉じてはいけません。そうではありません。

+0

一般に、「内部」でないものはすべて「プライベート」または「パブリック」とマークする必要があります。これは、他の言語と同じ理由で、コンパイラを使用してアプリのデザイン/オブジェクトグラフを実行するのに役立ちます。同様にクラスの 'final'修飾子についても同様です。私の個人的な見解では、チュートリアルでもこれを行うべきですが、チュートリアルでは、実際にはサンプルコードについての視点に立っているのかどうかということです。だから彼らの "意見"とスタイル、言い換えれば。 –

+0

回答は意見ではなく、事実に基づいているため、私は主に意見ベースでこの質問を終了するよう投票しています。 – JAL

答えて

2

なぜすべてがプライベートではないのですか?私が見てきたいくつかの本当に一般的なシナリオには、内部変数か公開変数のどちらかが常に好んでいます。

デリゲートメソッド:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  { 
    let cell = tableView.dequeueReusableCellWithIdentifier(
     myCellID, 
     forIndexPath: indexPath); 
    return cell; 
} 

この方法を使用することではなく、むしろのtableViewを管理し、表示するiOSのシステムではない内部的に呼び出されます。委任パターンは、iOS開発で広く使用されています。その後

class MyVC1: UIViewController { 

    var flagShouldUpateColors = false { 
     didSet{ 
      // some stuff 
     } 
    } 


} 

いくつかの点であなたはフラグをtrueに設定する必要があることをこのViewControllerををnotifiyしたい:あなたは、単に他のViewControllerのフィールドを設定したい2 ViewControllers、間

データ交換。あなたは私が単にそのフィールドにアクセスすることを行う。

セレクタ。何らかの通知のためにViewControllerのインスタンスを登録するとき、私は非常に同じViewController内にあるメソッドの名前を渡します。通知がトリガされたときに呼び出されます。基本的には、コードが "これが発生したときに私のためにこのメソッドを呼び出してください"と言うことです。これが発生したときにメソッドを呼び出すと、それは意味がありませんか?発信者はそれをどのように呼び出さなければならないのですか(反射やその他の最適化されていない方法を除いて)。ここでは一例です:いないすべてのチュートリアルがプライベートプロパティが含まれているサンプルコードを提供する場合

override func viewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(
     self, 
     selector: #selector(self.doStuffWhenEnterForeground), 
     name: UIApplicationWillEnterForegroundNotification, 
     object: app) 
    doStuffWhenEnterForeground(); 
} 
func doStuffWhenEnterForeground() { 

} 
+0

これらの3つ以外のものはすべてプライベートでなければなりません。それはあなたが意味することですか? – Sweeper

+0

私は今すぐ眠らなければならない、私は明日受け入れます。 – Sweeper

1

JavaとSwiftの主な違いはプロパティです。

Javaにはプロパティの概念がありません。それにはフィールドがあり、それらのフィールドへのパブリックアクセスを許可する場合は、直接またはゲッター/セッターメソッドを使用してアクセスできます。

後で保護する必要があるパブリックフィールドを作成する場合、メソッドを使用する必要があり、パブリックAPIが変更されます。フィールドには、括弧やメソッドを使用せずにアクセスします。

スイフトはその点で異なります。 APIを変更することなく、いつでもgetter/setterでフィールドへのアクセスを保護することができます。したがって、公開APIの一部であるフィールドを持っている場合は、それをそのまま(非公開にすることなく)残して、getter/setterメソッドをアタッチしなくてもかまいません。

JavaとSwiftでのカプセル化は同じ重要性を持っています。どのように異なるのかは、それがどのように達成されるか(実装される)です。 早期カプセル化のためのプレッシャーがないので、適切なときに可視性指定子を追加することは、の規律がないことがあります。主目的がカプセル化を強制していないが、とハウツーです。

1

はなぜ、ほとんどないのですか?それはiOSがより安全なものか何かですか?プロダクションコードではプライベートなものとしてマークする必要がありますか?

恐らく簡単なので、キーストロークを少なくして、チュートリアルの主なテーマを理解するために不必要なオーバーヘッドを追加することはないでしょう。

プロダクションコードではプライベートとしてマークする必要がありますか?

はい、Javaで実行するのと同じ理由で実行する必要があります。しかし、2つのことを通知してください:

  1. protectedのようなものはありません。
  2. 他の多くの言語とは異なる方法で、スウィフトの作業にアクセスする修飾語。 privateは、変数または関数へのアクセスを、それが宣言されたファイルに制限します。にアクセスする人にかかわらず、。したがって、同じファイルで宣言された2つのクラスがある場合、それらのクラスは両方とも互いにプライベートフィールドを見ることができます。一方、この拡張子が他のファイルにある場合、そのクラスの拡張子からでもプライベートフィールドは表示されません。最初は奇妙に見えますが、それに慣れる必要があります。
関連する問題