无法访问扩展 Objective-C 类的 Swift 类中的私有变量

Posted

技术标签:

【中文标题】无法访问扩展 Objective-C 类的 Swift 类中的私有变量【英文标题】:Can't access private variable in a Swift class that extends an Objective - C class 【发布时间】:2016-04-26 23:50:19 【问题描述】:

我们的应用是使用 Cordova 的混合应用。因此很多逻辑都是在 webview 中完成的。

我遇到了需要访问 webview 对象的场景。

问题是我不能动手!

这里是基类CDVPlugin.h

@interface UIView (org_apache_cordova_UIView_Extension)

@end

// Stuff

@interface CDVPlugin : NSObject 

@property (nonatomic, readonly, weak) UIView* webView; // This is what I want 

进入CDVPlugin.m 文件,它看起来像这样:

@interface CDVPlugin ()

// Other codes

- (UIView*)webView

    if (self.webViewEngine != nil) 
        return self.webViewEngine.engineWebView;
    

    return nil;

而我的扩展 CDVPlugin 的 Bridge.swift 文件如下所示:

@objc(Bridge) class Bridge:CDVPlugin

   func getWebView() -> UIWebView
   
     self.webView // Does not exist
   

我更加困惑,因为它的其他子类能够访问这个 webView 变量。比如这个插件类:

#import "CDVPlugin.h"

@interface CDVGestureHandler : CDVPlugin

@property (nonatomic, strong) UILongPressGestureRecognizer* lpgr;

@end

可以访问私有方法吗?

#import "CDVGestureHandler.h"

@implementation CDVGestureHandler

- (void)pluginInitialize

   NSArray *views = self.webView.subviews;

我不确定为什么其他一些 Objc 类能够从其父类访问私有方法,或者为什么我不能从扩展它的 Swift 类访问它。

如果你能告诉我如何访问这个webView 对象,我全神贯注!

测试显示 self 无法访问它,但实例可以。

【问题讨论】:

我尝试使用一个简化的示例重现您的问题,该示例涉及 NSString 上具有类别类型的属性(只读),但我能够从派生的 Swift 类中访问该属性。几个问题/想法: - 你能在你的 Swift 代码中实例化 CDVPlugin 并访问该属性吗? - 尝试创建一个 NSString* 类型的属性,它返回,比如,@"MY PROPERTY",看看它是否可以从 Swift 访问。 - 你怎么知道self.webView 不存在?它没有在 Xcode 提示中列出吗? - 属性实现是否位于正确的@implementation 部分? 有趣的是,如果我实例化它,我可以访问。但我无法从 self 实例访问它 【参考方案1】:

轻微的发呆。

我的班级正在使用全局函数,因此无法访问成员变量。错误消息让我失望了。

“实例成员不能用于 Bridge 类型”。

我现在明白这意味着它是类 func 中的实例访问。我想知道黑暗之魂3的loremaster是否写了编译器错误。

【讨论】:

以上是关于无法访问扩展 Objective-C 类的 Swift 类中的私有变量的主要内容,如果未能解决你的问题,请参考以下文章

Swift 类的 Objective-c 协议。无法识别的方法

Objective-C(11)类的扩展---分类

无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法

Objective-C_类的扩展

Objective-C:访问另一个类的属性

从 Objective-C 访问 Swift 扩展