将 initWithString 从 objective C 转换为 Swift

Converting initWithString from objective C to Swift

我是 swift 和 objective C 编程语言的新手。我有点困惑,因为我必须将代码从 objective C 迁移到 swift。

Objective C代码如下:

- (name *)initWithString:(NSString *)name num:(NSNumber *)num {
    self = [super init];
    if (self) {
        self.name = name;
        self.num = num;
    }

    return self;
}

+ (instancetype)initWithString:(NSString *)name num:(NSNumber *)num {
    return [[self alloc] initWithString:name num:num] ;
}

从我的理解到现在,我已经到了swift的这一部分:

func init(name: String?, num: NSNumber?) {
    super.init()
    self.name = name
    self.num = num

    return self
}

class func init(name: String?, num: NSNumber?) -> Self {
    return self.init(name: name, num: num)
}

但是,我仍然对如何将 initWithString 转换为 swift 初始化程序感到困惑。从文档中,我只得到了它的基本语法。

  1. 如何解决这个问题?
  2. initWithString 和普通 init 有什么区别?
  3. 我认为-表示实例方法,+表示静态方法。有没有人可以介绍一下。

您的 Swift 代码有几个问题。首先,当您创建一个 init 时,没有 func 关键字,init 本身就是表明这是一个 init 而不是简单函数的关键字。其次,在 Swift 初始化器中没有 return 语句(除非它是一个可失败的初始化,但即使那样你也只能 return nil 来使初始化失败)。您只需为所有存储的属性分配一个值,无需 return self(与 Obj-C 不同)。也不需要调用 super.init(),因为 Swift classes 不需要从基础 class 继承(不像 Obj-C 中 NSObject 是基础 class).

也不需要添加静态方法,因为在 Swift 中您可以直接在类型名称上调用 init,例如 let instance = Something(name: "name", num: 1).

所以这 2 个 Obj-C 方法在 Swift 中转换为:

class Something {
    let name: String?
    let num: NSNumber?

    init(name: String?, num: NSNumber?) {
        self.name = name
        self.num = num
    }
}

关于Obj-C代码本身的问题:

你明白了-+之间的区别,-表示实例方法,而+表示类型方法。

普通初始化- (name *)initWithString:(NSString *)name num:(NSNumber *)num和类型函数+ (instancetype)initWithString:(NSString *)name num:(NSNumber *)num的区别在于当你调用一个Obj-C初始化时,你需要做[[Type alloc] initWithString],而使用静态方法,无需调用 alloc,只需调用 [Type initWithString].