Причина, по которой вы не можете вызвать
@objc public func ladeURL(url: URL?) {
print("loadURL")
}
, сказав
[URLTask ladeURL:testURL];
, заключается в том, что ladeURL:
- это , а не название этого метода, поскольку Objective-C Это то, что имеет в виду компилятор, когда он говорит, что «Нет видимого @interface для 'rURLTask' объявляет селектор ladeURL:
».
Его имя для Objective-C это ladeURLWithUrl:
.Это потому, что вы выставили имя параметра url:
как внешнюю метку.
Если для вас было важно иметь возможность сказать
[URLTask ladeURL:testURL];
в Objective-C, вы могли бы объявить ladeURL
так:
@objc public func ladeURL(_ url: URL?) {
print("loadURL")
}
Видите подчеркивание?Это скрывает внешнюю метку параметра.
Другое решение, позволяющее сохранить внешнюю метку url:
, - объявить имя Objective-C как часть атрибута objc
:
@objc(ladeURL:) public func ladeURL(url: URL?) {
print("loadURL")
}
Это говорит компилятору: «Я знаю, что вы хотели бы перевести имя этого метода в Objective-C как ladeURLwithUrl:
, но не переводите еговместо ladeURL:
. "