从 Objective-c 项目访问时找不到某些 Swift 类属性

NKo*_*kov 5 objective-c swift

我正在尝试将一些 Swift 代码引入我的旧 obj-c 项目中。Swift 类可以从 obj-c 类访问,但不是它的所有属性。例如

public var menuTitleColor: UIColor!
Run Code Online (Sandbox Code Playgroud)

工作得很好,但是

public var cellHeight: CGFloat!
Run Code Online (Sandbox Code Playgroud)

没有找到。我认为这是因为 CGFloat 不是一个对象。有没有办法在不更改 Swift 文件的情况下访问此属性?

Luc*_*tti 5

Objective-C 中的基本类型

看看这个 Swift 类

@objc class Foo: NSObject {
    var myCGFloatOptional: CGFloat? = 1
    var myCGFloat: CGFloat = 1
}
Run Code Online (Sandbox Code Playgroud)

如果我在 Objective-C 中使用它,则只有该myCGFloat属性可用。

Foo * foo = [Foo new];
foo.myCGFloat;
foo.myCGFloatOptional; // Compile Error
Run Code Online (Sandbox Code Playgroud)

这是因为在 Objective-C 中CGFloat是原始类型(如float)。Objective-C 不允许nil使用原始类型的值。

就像你不能用 Objective-C 写这个一样

float number = 1;
number = nil; // compile error
Run Code Online (Sandbox Code Playgroud)

对类实例的引用

在 Objective-C 代码中,您可以看到UIColor!Swift 中声明的类型的属性,因为它UIColor是一个类。因此,您声明的指针可以引用某个实例UIColor,也可以不引用任何内容。

在 Objective-C 中也存在同样的概念。

笔记

您可能会注意到,这int在 Objective-C 中也是一个原始类型,但是“出乎意料”的是,编译器确实允许您编写

int number = 1;
number = nil;
Run Code Online (Sandbox Code Playgroud)

然而,在这种情况下,nil它被简单地解释为整数 0(仍然是一个值,而不是真正的值nil)。