首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift扩展文件中访问Obj-C属性

在Swift扩展文件中访问Obj-C属性
EN

Stack Overflow用户
提问于 2015-10-22 07:45:17
回答 5查看 9K关注 0票数 21

我开始在视图控制器上编写Swift扩展。所以我现在有三个文件:

我的头文件,ViewController.h

代码语言:javascript
运行
复制
@interface MyViewController : UIViewController

@end

我的Obj实现文件,ViewController.m

代码语言:javascript
运行
复制
@interface MyViewController () <UIScrollViewDelegate>
@property (strong, nonatomic) UIScrollView *scrollView;
@end

@implementation MyViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.scrollView = [[UIScrollView alloc] init];
    [self customiseScrollView]; //This is Swift method called from Obj-C file
}

@end

最后,ViewController.swift

代码语言:javascript
运行
复制
extension MyViewController {

    func customiseScrollView() {

    }
}

我的问题是,是否可以从我的Swift实现文件访问我的Obj属性?每次我提到它,我都会发现一个错误:

代码语言:javascript
运行
复制
Value of type 'MyViewController' has no member 'scrollView'

奖金1:还能有人澄清Swift组件是否也能看到.m是什么委托。(澄清一下,在Swift中执行scrollView.delegate = self是一个编译错误,因为Swift文件没有意识到.m文件是一个UIScrollViewDelegate)。

红利2: Swift扩展文件可以调用从.m对应方声明的Obj方法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-10-22 07:56:17

我认为你不能从分机访问私有财产。您的scrollView属性位于.m文件中,而不是.h中--这意味着它是私有的,并且在扩展名文件中不可见。

解决方案:移动

代码语言:javascript
运行
复制
@property (strong, nonatomic) UIScrollView *scrollView;

到你的头文件。

票数 17
EN

Stack Overflow用户

发布于 2018-12-26 15:43:12

如果在单独的头中声明objc类扩展并在桥接标头中包含该标头,则可以访问内部objc属性和方法。

MyClass.h

代码语言:javascript
运行
复制
@interface MyClass : NSObject

@property (nonatomic, copy, readonly) NSString *string;

@end

MyClass+Private.h

代码语言:javascript
运行
复制
#import "MyClass.h"

@interface MyClass ()

@property (nonatomic, copy) NSString *string;

@end

MyClass.m

代码语言:javascript
运行
复制
#import "MyClass+private.h"

@implementation MyClass

//...

@end

Project-Bridging-Header.h

代码语言:javascript
运行
复制
#import "MyClass.h"
#import "MyClass+Private.h"
票数 6
EN

Stack Overflow用户

发布于 2015-10-22 08:13:10

在Swift中,私有属性无法从其他文件访问。这是private在Swift中的意思。例如:

file1.迅速的

代码语言:javascript
运行
复制
class MyClass {
    private var privateProperty: String = "Can't get to me from another file!"
}
extension MyClass: CustomStringConvertible {
    var description: String {
        return "I have a `var` that says: \(privateProperty)"
    }
}

文件2.快速的

代码语言:javascript
运行
复制
extension MyClass {
    func cantGetToPrivateProperties() {
        self.privateProperty // Value of type 'MyClass' has no memeber 'privateProperty'
    }
}

在Objective类的实现中声明的属性是私有属性。因此,不能从Swift扩展名访问该属性,因为这必须来自不同的(.swift)文件.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33275758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档