无法访问扩展 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 协议。无法识别的方法