如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数

Posted

技术标签:

【中文标题】如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数【英文标题】:How do I call a Swift function from Objective-C that has a hidden variable name (_ before parameter) or an internal + external (e.g. foo(with bar:)) 【发布时间】:2021-02-26 18:00:07 【问题描述】:

我正在尝试在我的 Objective-C 模块中使用 Swift 代码并且已经:

导入 在我打算在 Objective-C 中使用的每个类和函数前面设置 @objc

然而,我仍在努力在 Objective-C 中使用隐藏变量名(带下划线)或同时使用内部和外部变量名的 Swift 函数。如何在 Objective-C 中调用以下函数?

Swift 代码:

@objc
public final class FeedUpdateAttachmentHelper : NSObject 
    @objc
    func myFunction(_ postMetadata: PostMetadata) 
         ...
    
    @objc
    func secondFunction(for postMetadata: PostMetadata) 
         ...
    


我如何尝试在 Objective-C 中调用它们:

[myFunction postMetadata:postMetadata];

[secondFunction forPostMetadata:postMetadata];

两者都给我以下错误:

没有已知的选择器类方法,“function/secondFunction”

【问题讨论】:

【参考方案1】:

您始终可以通过 CMD+CTRL 单击#import YourModuleName-Swift.h 来查看您的 Swift 类的 Objective-C 界面。

在这种情况下,它看起来像:

@interface FeedUpdateAttachmentHelper : NSObject
- (void)myFunction:(PostMetadata * _Nonnull)postMetadata;
- (void)secondFunctionFor:(PostMetadata * _Nonnull)postMetadata;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

并且会这样使用:

-(void)doThing 
    
    FeedUpdateAttachmentHelper *helper = [[FeedUpdateAttachmentHelper alloc] init];
    PostMetadata *metadata = [[PostMetadata alloc] init];
    [helper myFunction:metadata];
    [helper secondFunctionFor:metadata];
    

【讨论】:

以上是关于如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数的主要内容,如果未能解决你的问题,请参考以下文章

5.2访问限制

面对对象进阶2

如何从 PHP 访问表单的“名称”变量

廖雪峰Python总结4

__init__() 内部和外部变量之间的差异

为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰