2016-11-06 5 views
2

.Netから来て、私はSwift3/iOSを習得しようとしており、オプションのプロトコルメンバーの次の見かけの一貫性のない動作に困惑しました。私は、その何かがobjc/swiftの間のジャグリングと関係があると思っていますが、実際にここで何が欠けていますか?Swiftのオプションのプロトコル動作の不一致

// In playground, given below: 

@objc protocol SomePtotocol { 
    @objc optional func someMethod() 
} 

class SomeDelegate: NSObject, SomePtotocol { 
} 

class SomeController: NSObject { 
    var delegate: SomePtotocol = SomeDelegate() 
} 

// This works and compiles without error 

let controller = SomeController() 
controller.delegate.someMethod?()  // No error, typed as '(() ->())?' 

// But this fails to even compile ?? 

let delegate = SomeDelegate() 
delegate.someMethod?() // Error: 'SomeDelegate' has no member 'someMethod' 

私は両方が失敗または両方のパスなので、誰かが喜ばことができれば、この異常に私を啓発するか期待します。

+0

あなたがiOSとSwiftを学んでいるなら、私は '@ objc'と' NSObject'を使わない**の使用を勧めます。構造体ができないことをしようとしない限り 'class'に' struct'を優先します。同様に、 'var'より' let'を優先します。このコードはSwiftyではありません。 – KPM

+0

私はクラスの上に構造体があることを知っていますが、残念ながら、.NETのように私の頭を包み込むのに苦労している概念の別の領域でも、構造体よりもクラスを優先するよう教えられました。 –

答えて

1

2つのコードブロックの違いは、関連する変数のタイプです。

最初のブロックでdelegateSomePtotocolと明示的に入力されており、このプロトコルはsomeMethodメソッドを定義しているため、このステートメントは有効です。第二のブロックで

delegateは暗黙のうちにSomeDelegateとして入力されており、このクラスがSomePtotocolに準拠しますが、それは任意の方法someMethodを実装していないので、あなたがエラーを取得します。

あなたが最初のブロックに相当する

let delegate: SomePtotocol = SomeDelegate() 
delegate.someMethod?() 

にあなたの第二のブロックを変更すると、エラーはありません。

+0

よく説明され、実際に意味があります - ありがとう –

関連する問題