swift2 分配带有nil属性的新swift类对象,返回nil对象

kcwpcxri  于 2022-11-23  发布在  Swift
关注(0)|答案(4)|浏览(218)

我试图从目标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的结果实际上是由于描述方法的覆盖而发生的。对象的创建按原样发生。

kuhbmx9i

kuhbmx9i1#

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

kxkpmulp

kxkpmulp2#

通常,当我们尝试打印一个Object时,默认情况下会打印description属性中的对象描述。
实际上,您使用prop1覆盖了超类(NSObject)属性description,因此,无论何时尝试在控制台或print语句中打印statusObj,它都会返回nil,这是来自覆盖属性description
所以,如果你从ClassStatus类中删除了description变量,你就可以在printconsole语句中看到实际的变量。否则,你就必须用prop1初始化来获得无nil的描述。

dl5txlt9

dl5txlt93#

几件事:
@objc不是必需的,因为您正在对NSObject进行子类化。另外,只需执行“private(set)”,而不是“public private(set)”。
最后,也是最重要的一点,您的init方法必须更改为:

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

您必须在调用super.init()之前初始化成员

1l5u6lss

1l5u6lss4#

这里是overriding的默认函数NSObject,当前正在打印nil
description是打印和对象封装外形的函数。
你可以检查这个链接,你可以如何override description和利用它
http://iosdevelopertips.com/cocoa/overriding-nsobject-description-method.html

相关问题