使用nil属性分配一个新的swift类对象,返回我的nil对象

时间:2016-09-09 08:48:31

标签: ios objective-c swift swift2

尝试从目标C以及swift类创建一个新的swift类对象,其中initializer参数是可选的。

这是我试图初始化的课程,

@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
    }
}

来自Swift,

let statusObj = ClassStatus(prop: nil)

来自Objective-C

ClassStatus *connState = [[ClassStatus alloc]initWithProp:nil];

为什么在这两种情况下创建的对象都是nil,而不是将预期属性的有效对象返回给nil。

EDIT :: 打印对象会给你零。在这里,我实际上尝试使用该对象,并在对象中查找属性是否为零或有效,基于此我将继续进行。这里的情况是,为什么对象变为nil而不是创建一个属性为nil的有效对象。

编辑2:这不是一个有效的问题,因为nil的结果实际上是因为覆盖了描述方法而发生的。对象创建按原样发生。

4 个答案:

答案 0 :(得分:1)

通常,当我们尝试打印Object时,它会默认从description属性打印对象描述。

实际上你用NSObject覆盖超类(description)属性prop1,所以每当你试图在console或print语句中打印statusObj时,它返回nil,这是来自最重要的财产description

因此,如果从description类中删除ClassStatus变量,则可以在printconsole语句中查看实际变量。否则,您必须使用prop1初始化以获取无nil说明。

答案 1 :(得分:1)

正如Martin R所说,它只是打印出来的描述.ClassStatus已启动,它不是零。我知道这不是一个解决方案,但我没有足够的声誉发表评论.. !! :-)

答案 2 :(得分:0)

一些事情:

由于您是NSObject的子类,因此不需要@objc。 此外,只做'私人(设定)',而不是'公私(设))。

最后也是更重要的是,您的init方法必须更改为:

public init(prop: DemoClass?) {
    self.prop1 = prop
    super.init()
}

您必须在调用super.init()

之前初始化您的成员

答案 3 :(得分:0)

overriding的默认功能NSObject正在打印nil

description是一个打印和对象足迹的函数。

您可以查看此链接,了解如何override description并充分利用它

http://iosdevelopertips.com/cocoa/overriding-nsobject-description-method.html