Ios 如何使用Swift参数定义Swift协议中的可选方法? TL;博士

Ios 如何使用Swift参数定义Swift协议中的可选方法? TL;博士,ios,swift,protocols,Ios,Swift,Protocols,如何在接受自定义类型参数的swift协议中定义可选方法 案件 我知道在swift协议中定义可选方法的方法是使用@objc标志。像这样: @objc protocol someSweetProtocol { optional func doSomethingCool() } 但是当我想对参数使用我的自定义类型时,就像这样: @objc protocol someSweetProtocol { optional func doSomethingCool(Put the defaul

如何在接受自定义类型参数的swift协议中定义可选方法

案件 我知道在swift协议中定义可选方法的方法是使用
@objc
标志。像这样:

@objc protocol someSweetProtocol {
    optional func doSomethingCool()
}
但是当我想对参数使用我的自定义类型时,就像这样:

@objc protocol someSweetProtocol {
    optional func doSomethingCool(Put the default implementations in an extension, like so:

class HSCoolPerson {}

protocol SomeSweetProtocol {
    func doSomethingCool()
}

extension SomeSweetProtocol {
    func doSomethingCool(The problem is this:

class HSCoolPerson {
    // ...
}
class HSCoolPerson : NSObject {
    // ...
}
@objc协议{

可选func doSomethingCool(将默认实现放在扩展中,如下所示:

@objc protocol someSweetProtocol {
    optional func doSomethingCool(Put the default implementations in an extension, like so:

class HSCoolPerson {}

protocol SomeSweetProtocol {
    func doSomethingCool()
}

extension SomeSweetProtocol {
    func doSomethingCool(The problem is this:

class HSCoolPerson {
    // ...
}
class HSCoolPerson : NSObject {
    // ...
}
类HSCoolPerson{}
协议,协议{
func doSomethingCool()
}
扩展协议{

func doSomethingCool(将默认实现放在扩展中,如下所示:

@objc protocol someSweetProtocol {
    optional func doSomethingCool(Put the default implementations in an extension, like so:

class HSCoolPerson {}

protocol SomeSweetProtocol {
    func doSomethingCool()
}

extension SomeSweetProtocol {
    func doSomethingCool(The problem is this:

class HSCoolPerson {
    // ...
}
class HSCoolPerson : NSObject {
    // ...
}
类HSCoolPerson{}
协议,协议{
func doSomethingCool()
}
扩展协议{
func doSomethingCool(问题在于:


错误消息清楚地告诉您,该类型HSCoolPerson类对Objective-C是完全不可见的。协议可选方法是Objective-C语言的一个功能;Swift只是借用了它(这就是为什么您必须说
@objc protocol
才能获得此功能)所以,任何时候你想要定义一个协议可选方法,你必须以Objective-C可以理解的方式来做,因为Objective-C将为你做这项工作

要将此类公开给Objective-C,只需从NSObject派生它:

问题已解决。

问题在于:


错误消息清楚地告诉您,该类型HSCoolPerson类对Objective-C是完全不可见的。协议可选方法是Objective-C语言的一个功能;Swift只是借用了它(这就是为什么您必须说
@objc protocol
才能获得此功能)所以,任何时候你想要定义一个协议可选方法,你必须以Objective-C可以理解的方式来做,因为Objective-C将为你做这项工作

要将此类公开给Objective-C,只需从NSObject派生它:


问题已解决。

您可以像在协议中那样声明func


@objc optional func doSomethingCool(您可以像在协议中那样声明func


@objc optional func doSomethingCool(HSCoolPerson是如何定义的?它必须是NSObject的子类。只是更新了问题“没有什么特别的…”这就是问题所在!请看下面我的答案。我的答案中有一个错误,我更新了它。HSCoolPerson是如何定义的?它必须是NSObject的子类。只是更新了问题“没有什么特别的…”这正是问题所在!请看下面我的答案。我的答案中有一个错误,我更新了它。请看我的在线Swift书籍,其中列出了Objective-C所能看到和不能看到的Swift事物:“Swift只是借用了它,事实上。”-知道他们为什么没有将可选协议方法直接构建到Swift本身吗?也许有一个明显的原因我不知道。@TimVermeulen我只能猜测:我怀疑他们根本不想拥有这个功能,但为了兼容性,他们只需镜像Objective-C的功能,特别是因为如此多的Cocoa协议依赖于n此功能。因此,该情况与任何对象的情况类似,其真正存在的理由是Objective-C
id
要与之对应。我的印象是,有一种快速的方法可以做到这一点。不过,谢谢,效果很好,而且很干净。我想这就是您尝试制作两种不同语言时得到的结果也许我应该说“可可”,而不是说“Objul-C”,但它的意思是相同的。在不导入基础的游乐场(或UIKIT或任何其他自己的基础)中尝试说<代码> Objp协议p{} /代码>游乐场。请看我的在线Swift书籍,其中列出了Objective-C可以看到和不能看到的Swift内容:“Swift只是借用了它,就像它过去一样。”-知道他们为什么没有将可选协议方法直接构建到Swift本身吗?也许有一个明显的原因我不知道。@TimVermeulen我只能猜测:我怀疑他们根本不想拥有这个功能,但为了兼容性,他们只需镜像Objective-C的功能,特别是因为如此多的Cocoa协议依赖于n此功能。因此,该情况与任何对象的情况类似,其真正存在的理由是Objective-C
id
要与之对应。我的印象是,有一种快速的方法可以做到这一点。不过,谢谢,效果很好,而且很干净。我想这就是您尝试制作两种不同语言时得到的结果也许我应该说“可可”,而不是说“Objul-C”,但它的意思是相同的。在不导入基础的游乐场(或UIKIT或任何其他自己的基础)中尝试说<代码> Objp协议p{} /代码>游乐场。