【问题标题】:Cannot access Swift vars from objective-c, Xcode 8无法从 Objective-c、Xcode 8 访问 Swift 变量
【发布时间】:2017-02-19 18:34:24
【问题描述】:

我看过很多关于这个主题的帖子,但我仍然看不出我做错了什么。我在objective-c 中有一个视图控制器,它试图在Swift 中访问NSObject 代码sn-p。我有调试模块YES和objective-c Bridging Header 和 Swift 标头位于 Build Settings 中的正确位置。以下是代码的相关部分:

View Controller.m

    //
//  ViewController.m
//  swiftTest
//
//  Created by Nelson Capes on 2/19/17.
//  Copyright © 2017 Nelson Capes. All rights reserved.
//

#import "ViewController.h"
#import "swiftTest-Swift.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    MyClass
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

Swift 代码:

    //
//  MyClass.swift
//  swiftTest
//
//  Created by Nelson Capes on 2/19/17.
//  Copyright © 2017 Nelson Capes. All rights reserved.
//

import Foundation
@objc public class MyClass:NSObject{
    var property:String = ""
    func method() {
        print(self.property)
    }
}

在 ViewController.m 中,开始键入 MyClass 会收到来自编译器的以下警告:

/Users/nelson/swiftTest/swiftTest/ViewController.m:20:5:使用未声明的标识符“MyClass”。

请注意,我将 Swift 类声明为 @objc 和 public。我对 Apple 文档的理解是,这应该使任何变量和函数对同一目标中的 Objective-C 代码可见。项目模块名称为“swiftTest”。

任何人都可以对此有所了解吗?我几乎一整天都在努力让它工作。谢谢!

【问题讨论】:

  • 那是你的真实代码吗?在viewDidLoad 中只有MyClass?那无法编译。你希望它做什么?
  • 您是否尝试在 Objective-C 文件的viewDidLoad 中编写 Swift 语法?我很确定你可以使用 Swift 类,但你仍然需要使用 Obj-C 语法 MyClass *swiftObject = [[MyClass alloc] init]; - 或者你的初始化程序已经设置好了。
  • 不,这不是真正的代码。正如我在帖子中所说,一旦我进入 MyClass,编译器就不会让我添加其余的代码。但这里是原始的、未编译的代码:
  • @MartinR,不,这不是真正的代码。正如我在帖子中所说,一旦我进入 MyClass 编译器就不会让我添加其余的代码。但这里是原始的、未编译的代码,奇怪的是它现在可以工作了。我不知道有什么不同,但是当我遇到“使用未声明的标识符”错误时,这与我之前运行的相同: - (void)viewDidLoad { [super viewDidLoad]; // 在加载视图后做任何额外的设置,通常是从一个 nib。 MyClass *myclass= [[MyClass alloc]init]; myclass.property = @"你好,斯威夫特"; [我的类方法]; }

标签: objective-c swift xcode objective-c-swift-bridge


【解决方案1】:

试试@objc public var property:String = ""

@objc public 如果您尝试 做一些无法在 objc 中表示的事情 你会得到

属性不能被标记为@objc,因为它的类型不能被表示 在 Objective-C 中

如果你没有 objc 可访问的符号,那么 objc 桥接器会将你的类 prtimize。就是你看到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多