Jordan Wood
Jordan Wood

Reputation: 2899

Is it safe to ignore compiler warning caused by referring to dispatch_queue_t from Swift?

I have an Objective C class which has the following property:

@property (nonatomic, strong, readonly) dispatch_queue_t couchDispatchQueue;

I have a Swift extension of that class where I reference that property like so:

couchDispatchQueue.async {

When I do that, I get the following compiler warning:

Property type 'OS_dispatch_queue * _Nullable' is incompatible with type 'dispatch_queue_t _Nullable' (aka 'NSObject *') inherited from 'BZCouchDatabase'

I can see why, since my app's generated App-Swift.h file has:

@property (nonatomic, readonly, strong) OS_dispatch_queue * _Nullable couchDispatchQueue;

while dispatch_queue_tis defined as:

typedef NSObject<OS_dispatch_queue> *dispatch_queue_t;

Edit

I've figured out the "further complication" that I was missing in my original description. This property is required by an Objective C protocol which also requires inheritance from NSObject. As soon as I make the Swift class inherit from NSObject and conform to the objective C protocol, I get the warning. The following sample code is enough to set off the warning:

Objective C:

@protocol Thingness 
@property (nonatomic, strong, readonly, nullable) dispatch_queue_t couchDispatchQueue;
@end

Swift:

class Thing: NSObject, Thingness {
    var couchDispatchQueue: DispatchQueue?
}

My question still is: is it safe for me to just silence this warning? Should I file a radar?

Upvotes: 1

Views: 194

Answers (1)

matt
matt

Reputation: 535989

Very well described situation — but I can't reproduce it. When I declare

@property (nonatomic, strong, readonly) dispatch_queue_t couchDispatchQueue;

in an Objective-C class file, the generated header shows me

open var couchDispatchQueue: DispatchQueue! { get }

This is thus seen as a normal Swift 3 DispatchQueue, and my call to couchDispatchQueue.async produces no warning at all.

To be clear, I tried it two ways. I declared the couchDispatchQueue property in the .h file for a Thing class. I imported Thing.h into Swift. I then wrote this code in Swift:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        Thing().couchDispatchQueue.async {}
    }
}

extension Thing {
    func test() {
        self.couchDispatchQueue.async {}
    }
}

Neither in the straight instance method call nor in the extension do I see any warning.

Upvotes: 1

Related Questions