我试图从目标C和swift类创建一个新的swift类对象,其中初始化器参数是可选的。
这是我要初始化的类
@objc
public class ClassStatus: NSObject {
public private(set) var prop1: DemoClass?
public private(set) var prop2: DemoClass2?
public override var description: String {
return "\(prop1)"
}
public init(prop: DemoClass?) {
super.init()
self.prop1 = prop
}
public convenience init(propA: DemoClass?, propB: DemoClass2) {
self.init(prop: propA)
self.prop2 = propB
}
}
来自斯威夫特,
let statusObj = ClassStatus(prop: nil)
来自Objective-C
ClassStatus *connState = [[ClassStatus alloc]initWithProp:nil];
为什么在这两种情况下创建的对象都是nil,而不是返回一个有效的对象,其预期属性为nil。
EDIT::打印对象会给你nil。在这里,我实际上是在尝试处理对象,并寻找对象中的属性是nil还是valid,基于此我将继续下一步。这里的情况是,为什么对象会出现为nil,而不是创建一个属性为nil的有效对象。
编辑2:这不是一个有效的问题,因为nil的结果实际上是由于描述方法的覆盖而发生的。对象的创建按原样发生。
4条答案
按热度按时间kuhbmx9i1#
正如Martin R所说,它只是打印描述。ClassStatus被启动,它不是零。我知道这不是一个解决方案,但我没有足够的声誉发表评论...!!:-)
kxkpmulp2#
通常,当我们尝试打印一个Object时,默认情况下会打印
description
属性中的对象描述。实际上,您使用
prop1
覆盖了超类(NSObject
)属性description
,因此,无论何时尝试在控制台或print语句中打印statusObj,它都会返回nil,这是来自覆盖属性description
。所以,如果你从
ClassStatus
类中删除了description
变量,你就可以在print
或console
语句中看到实际的变量。否则,你就必须用prop1
初始化来获得无nil
的描述。dl5txlt93#
几件事:
@objc不是必需的,因为您正在对NSObject进行子类化。另外,只需执行“private(set)”,而不是“public private(set)”。
最后,也是最重要的一点,您的init方法必须更改为:
您必须在调用super.init()之前初始化成员
1l5u6lss4#
这里是
overriding
的默认函数NSObject
,当前正在打印nil
description
是打印和对象封装外形的函数。你可以检查这个链接,你可以如何
override description
和利用它http://iosdevelopertips.com/cocoa/overriding-nsobject-description-method.html