Dou*_*ith 54 xcode objective-c ios swift swift4
使用最新的Xcode 9 beta,我似乎完全无法访问Swift类的属性.甚至更奇怪,我可以访问类本身来实例化它或其他什么,但完全无法访问它上面的属性.
所以,如果我有这个Swift类:
import UIKit
class TestViewController: UIViewController {
var foobar = true
}
Run Code Online (Sandbox Code Playgroud)
我试着这样做:
TestViewController *testViewController = [[TestViewController alloc] init]; // success
testViewController.foobar; // error
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?Xcode 9的新项目.
Pau*_*tos 136
在Swift 4中将Swift代码暴露给Objective-C的规则已经改变了.试试这个:
@objc var foobar = true
Run Code Online (Sandbox Code Playgroud)
作为一种优化,@objc推断已在斯威夫特4.减少举例来说,一中的属性NSObject派生类,如你TestViewController,会不会再推断@objc在默认情况下(因为它在斯威夫特3一样).
或者,您也可以使用以下方法一次将所有成员公开给Objective-C @objcMembers:
@objcMembers class TestViewController: UIViewController {
...
}
Run Code Online (Sandbox Code Playgroud)
新设计在相应的Swift Evolution提案中有详细说明.
ing*_*nti 12
Swift 3.2/4.0/XCode 9.1
你在项目设置中设置了swift3.2(//:configuration = Debug SWIFT_VERSION = 3.2)
你可以使用你的代码,(在objc中使用正确的导入文件,见下文).如果您将项目设置为swift 4.0(//:configuration = Debug SWIFT_VERSION = 4.0)
您必须为每个属性添加@objc.
所以:
Swift 3.2:
// MyClass.swift
@objc class MyClass: NSObject{
var s1: String?
@objc var s2 : String?
}
//
// ViewController.m
import "MixingObjCAndSwift-Swift.h"
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyClass * mc = [MyClass new];
NSString * s1 = mc.s1;
NSString * s2 = mc.s2;
}
Run Code Online (Sandbox Code Playgroud)
作品.
Swift 4.0:
// MyClass.swift
@objc class MyClass: NSObject{
var s1: String?
@objc var s2 : String?
}
.....
- (void)viewDidLoad {
[super viewDidLoad];
MyClass * mc = [MyClass new];
NSString * s1 = mc.s1;
NSString * s2 = mc.s2;
}
Run Code Online (Sandbox Code Playgroud)
不起作用:编译器失败:
/Users....ViewController.m:24:21:在'MyClass*'类型的对象上找不到属性's1'
因为s1没有附加@objc.
你必须写:
@objc class MyClass: NSObject{
@objc var s1: String?
@objc var s2 : String?
}
Run Code Online (Sandbox Code Playgroud)
(作为旁注:在C/C++/ObJC文件中,将"system/general*h"文件放在"本地"类头之前.)
至于Swift 5.1,我发现“@objc”还不够,还要公开“@objc public”:
@objc public class SomeClass: NSObject {
@objc public let amount: NSNumber
...
Run Code Online (Sandbox Code Playgroud)