3

たとえば、既存の Objective-C クラスから Swift プロトコルを抽出したいと考えていますMyFoo。このプロトコルを と呼びましょうFooProtocol

状況は次のようになります。

// 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!
}

次に、これを行うことを許可する必要があります。

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

しかし、「MyFoo はプロトコル FooProtocol に準拠していません」と言われます。わかった。当然のことですが、プロトコル拡張には少しの調整が必要だと思います。

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

しかし、コンパイラから次のようなエラーが表示されます

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

私は何を間違っていますか?

4

1 に答える 1

0

インターフェイスには異なる署名があるため、コンパイラは実際に何をすべきかを知りません。

これを試して:

// 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!
}
于 2015-12-21T18:12:41.780 に答える