3

Par exemple, je souhaite extraire un protocole Swift de ma classe Objective-C existante MyFoo. Appelons ce protocole FooProtocol.Dans Swift, est-il possible pour les propriétés d'une classe Objective-C de satisfaire une exigence de propriété calculée du protocole Swift @obj?

La situation ressemble à ceci:

// In Objective-C 
@interface MyFoo 
@property(nonatomic, copy) NSString *foo; 
@end 
@implementation MyFoo 
// ... -(instancetype)initWithString: is implemented here 
@end 

// In Swift 
@objc protocol FooProtocol { 
    var foo: String { get set } 
} 

extension MyFoo: FooProtocol { 
    // do nothing here! 
} 

alors je devrais être autorisés à le faire:

let theFoo: FooProtocol = MyFoo(string: "Awesome") 
NSLog("\(theFoo.foo)") // Prints awesome. 

Mais on me dit "MyFoo ne se conforme pas au protocole FooProtocol". D'accord. Très bien, je suppose que l'extension du protocole a besoin d'un petit coup de coude:

extension MyFoo: FooProtocol { 
    var foo: String! { get { return foo } set { NSLog("noop") }} 
} 

mais je reçois des erreurs du compilateur qui ressemblent à

Getter for 'foo' with Objective-C selector 'foo' conflicts with previous declaration with the same Objective-C selector 

Qu'est-ce que je fais mal?

+0

'MyFoo' a besoin d'une classe de base, sinon le code Objective-C ne compile pas. 'laissez theFoo: Foo =' devrait probablement être 'laissez theFoo: FooProtocol ='. - Et puis votre code * compile * dans Xcode 6.4 et Xcode 7 GM. - C'est ton vrai code? –

+1

vous redéclarez la propriété de classe dans l'extension de protocole. Swift ne saura pas qui doit être exécuté – Mousavian

+0

@MartinR merci, j'ai mis à jour la question. Non, ce n'est pas mon vrai code. Je dois mettre en place un projet de test et essayer ... surprenant, parce que dans mon vrai projet je l'ai fait exactement et je continue à avoir l'erreur. – fatuhoku

Répondre

0

Les interfaces ont des signatures différentes et par conséquent le compilateur ne sait pas vraiment quoi faire.

Essayez ceci:

// In Objective-C 
@interface MyFoo 
@property(nonatomic, copy) NSString *foo; 
@end 
@implementation MyFoo 
// ... -(instancetype)initWithString: is implemented here 
@end 

// In Swift 
@objc protocol FooProtocol { 
    var foo: NSString { get set } 
} 

extension MyFoo: FooProtocol { 
    // do nothing here! 
}