2015-08-14 12 views
9
protocol Car { 
    static func foo() 
} 

struct Truck : Car { 

} 

extension Car { 
    static func foo() { 
     print("bar") 
    } 
} 

Car.foo() // Does not work 
// Error: Car does not have a member named foo 

Truck.foo() // Works 

Xcode compila automaticamente il Car.foo() correttamente, quindi quello che sto chiedendo è se è un bug che non viene compilato (dice che non ha un membro chiamato foo()). Potresti chiamare i metodi statici direttamente sul protocollo se sono definiti in un'estensione di protocollo?Come chiamare metodi statici su un protocollo se sono definiti in un'estensione di protocollo?

+2

L'auto non è un oggetto quindi non è possibile inviarlo alcun messaggio. – matt

+0

Mi sembra un insetto. Poiché l'implementazione predefinita associa direttamente la funzionalità effettiva al protocollo, dovrebbe essere richiamabile sul protocollo stesso. – hennes

+0

@hennes "l'implementazione predefinita associa la funzionalità effettiva direttamente al protocollo" non è una vera affermazione. L'implementazione predefinita associa funzionalità a classi e strutture conformi al protocollo. Ci sono [ragioni] (https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem) i protocolli non hanno implementazioni. –

risposta

5

di Apple doc

protocolli in realtà non implementano alcuna funzionalità stessi. Tuttavia, qualsiasi protocollo creato diventerà un tipo completo da utilizzare nel codice.

Pertanto, non è possibile chiamare i metodi statici direttamente dal protocollo.

1

No, il messaggio di errore non è buono, ma indica la cosa corretta.

pensare in questo modo, non si può avere

protocol Car { 
    static func foo() { 
     print("bar") 
    } 
} 

Questo compila con l'errore "metodi di protocollo non può avere i corpi".

Le estensioni del protocollo non aggiungono capacità a protocolli che non esistono.

+0

Nelle estensioni del protocollo Swift 2 è possibile aggiungere implementazioni predefinite. – hennes

+0

@hennes Sì, aggiungono implementazioni predefinite a classi e strutture ... non protocolli. Un protocollo non ha implementazione. –

+0

[Questo] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID521) dice il contrario, o mi sbaglio? – hennes

Problemi correlati