将带有参数的 Swift 函数分配给 Objective-C 属性 时出现奇怪的错误消息

Strange error message when assigning Swift function with arguments to Objective-C property

我想将 Objective-C class 实例的某些属性设置为某些 Swift 函数,但出现了一个我不理解的错误,可能与类型有关错误:

Objective-C:

@interface MyWrapper : NSObject
@property (nonatomic) void(*f1)();
@property (nonatomic) void(*f2)(void*);
@end

Swift:

func saySomething1() {
    print("Something 1")
}

func saySomething2(buf:UnsafeRawPointer) {
    print("Something 2")
}

let x = MyWrapper()
x.f1 = saySomething1 // OK
x.f2 = saySomething2 // error: Cannot assign to property: 'x' is a 'let' constant

let 更改为 var 没有帮助(相同的错误消息)。

问题不是变量 x 的可变性(无论如何它是 class 类型),而是 f2 的参数。使用 UnsafeMutableRawPointer,而不是 UnsafeRawPointer.


FWIW,如果您不确定参数类型,可以打开辅助编辑器,然后查看生成的Swift界面:

您可以从辅助编辑器的跳转栏访问:

或者您可以使用闭包,类型推断可以告诉您参数的类型: