2016-09-28 19 views
0

私はあまりにもよく理解していないものを見つけたとき、私は、良いチュートリアルのコードを読んでいたのメンバーに、プロトコルに型指定された変数を使用して(:https://www.ralfebert.de/tutorials/ios-swift-multipeer-connectivity/ConnectedColors.zip完全なコードはここにある):は割り当てとクラス

protocol ColorServiceManagerDelegate { 

func connectedDevicesChanged(_ manager : ColorServiceManager, connectedDevices: [String]) 
func colorChanged(_ manager : ColorServiceManager, colorString: String) 

} 

class ColorServiceManager : NSObject { 

fileprivate let ColorServiceType = "example-color" 
fileprivate let myPeerId = MCPeerID(displayName: UIDevice.current.name) 
fileprivate let serviceAdvertiser : MCNearbyServiceAdvertiser 
fileprivate let serviceBrowser : MCNearbyServiceBrowser 

// THIS ONE! 
var delegate : ColorServiceManagerDelegate? 

override init() { 

    self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: ColorServiceType) 
    self.serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: ColorServiceType) 

    super.init() 

    // AND THIS 
    self.serviceAdvertiser.delegate = self 
    self.serviceAdvertiser.startAdvertisingPeer() 

    // AND THIS 
    self.serviceBrowser.delegate = self 
    self.serviceBrowser.startBrowsingForPeers() 
    } 

私は理解していないことである。

  1. 開発者は、このデリゲート変数を宣言する理由。
  2. これはオプションです。
  3. なぜプロトコルのタイプですか?
  4. なぜコンパイラはdelegateプロパティを持たないserviceAdvertiserとserviceBrowserについて不平を言っていません。
  5. このデリゲートを自分自身に割り当てることによって彼が達成すること。わずか数:-)

    どれでも答えが高く評価されに名前を付ける

+1

これはかなり広い質問です。あなたが見ているのは、Delegationパターンの3つのインスタンスです。 [開始するにはここをクリックしてください](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID276) 。質問4については、これは3つの異なる「デリゲート」プロパティです。 ['MCNearbyServiceAdvertiser'](https://developer.apple.com/reference/multipeerconnectivity/mcnearbyserviceadvertiser)クラスを見ると、独自の' delegate'プロパティがあることがわかります – Arthur

+0

これを指摘してくれてありがとう私は3つのエラーを受けたと私は彼らがクラスに他の割り当てが表示されないため(または、良い、ちょうど別の3つのエラーを作る) –

+0

Ok、@Arthur、今度は私がそれをよく理解しています:エラーは別のファイル(別のファイルで、ビューコントロールで代理人を代入する場所)と内線番号 –

答えて

2
  1. iosのデリゲートとプロトコルは、Javaプログラミング言語に精通していれば、Javaのインターフェイスと同様にコールバックに使用されます。したがって、プロトコルには、そのプロトコルを確認するすべてのクラスによって実装される必要があるいくつかのメソッドが含まれています。また、代理変数は、上記のプロトコルからそれらのメソッドを呼び出すために使用されます。

  2. デリゲート変数は一般にオプションです。オブジェクトがプロトコルを確認せず、デリゲート変数がnilになる可能性があるからです。迅速にすべての非オプションの方法は(でsuper.initを呼び出す前にINITに初期化される場合、それはプロトコル

  3. のタイプであることが必要であるよう

  4. 参加者は、プロトコルからのメソッドを呼び出すために使用され)コンパイラに問題はありません

  5. delegateをselfに代入すると、オブジェクトはColorServiceManagerDelegateを実装することを宣言します。

希望します。

+0

です。私は5回答える:なぜ彼は 'class ColorServiceManager:NSObject、ColorServiceManagerDelegate'をやっていないのですか? –

+0

彼はこのコード拡張の行をチェックアウトしていますColorServiceManager:MCNearbyServiceAdvertiserDelegateクラス定義のすぐ下 –

+0

あなたと@Arthurのおかげで、私は他のファイルで興味深いものを見つけました:私が精神的に接続していなかったものは、 viewController viewDidLoadと、私たちが話しているデリゲートにあります。私はいつも "定義済み"の代理人を使用していましたが、カスタムの代理人は見たことがなかったので、さらに調査しています。どうもありがとうございました! –