将Swift协议传递给Objective-C指针

agi*_*ult 3 objective-c compiler-warnings pointer-conversion swift swift-protocols

使用XCode 10.1/Swift 4.2.

我正在尝试将符合Swift协议的对象分配给Objective-C指针.以下代码是一个最小的示例,编译和按预期工作,但它给了我以下警告:

如果分配给局部变量: Incompatible pointer types initializing 'NSObject<Animal> *__strong' with an expression of type 'id<Animal> _Nullable'

如果分配给存储的属性: Incompatible pointer types assigning to 'NSObject<Animal> *' from 'id<Animal> _Nullable'

关于如何解决这个警告而不仅仅是沉默它的任何想法?

SWIFT代码:

@objc protocol Animal {
    var name: String { get }
}

@objc class Pig: NSObject, Animal {
    var name: String = "pig"
}

@objc class Cow: NSObject, Animal {
    var name: String = "cow"
}

@objc class Farm: NSObject {
    static func getAnimal(name: String) -> Animal? {
        // return some animal or nil
    }
}
Run Code Online (Sandbox Code Playgroud)

Objective-C代码:

// This code returns a valid pointer to a Pig object
// that is usable in objective-c, but it also triggers 
// the warning described above
NSObject<Animal>* animal = [Farm getAnimalWithName:@"pig"];
Run Code Online (Sandbox Code Playgroud)

Jos*_*ell 5

指定每个Animal实现者还实现NSObject的接口:@objc protocol Animal : NSObjectProtocol

您还可以将ObjC中的变量类型更改为id<Animal>.