【问题标题】:Converting initWithString from objective C to Swift [closed]将 initWithString 从目标 C 转换为 Swift [关闭]
【发布时间】:2020-10-28 10:58:57
【问题描述】:

我是 swift 和客观的 C 编程语言的新手。我有点困惑,因为我必须将代码从目标 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 Programming Language 这本书来帮助您快速入门。并且不要过多关注 Objective-c 代码,而是专注于 swift。
  • 是的,我做到了,我注意到用 init 编写 func 的错误,那是我的错。我找不到我们不必添加@DavidPasztor 回答中提到的静态方法。

标签: objective-c swift function initialization


【解决方案1】:

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

也不需要添加静态方法,因为在 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 代码本身的问题:

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

普通的init- (name *)initWithString:(NSString *)name num:(NSNumber *)num和类型函数+ (instancetype)initWithString:(NSString *)name num:(NSNumber *)num的区别在于调用Obj-C的init时需要[[Type alloc] initWithString],而使用静态方法则不需要调用alloc,您可以直接拨打[Type initWithString]

【讨论】:

  • 我不会使用 NSNumber 并且我在质疑 OP 是否意味着将两个参数都作为可选项,并且它也是初学者错误的一部分
  • @David 我们需要class Something: NSObject{ ...} 之类的东西吗?如果没有,我们什么时候使用它?
  • @Alohomora 正如我在回答中所说,不,Swift 类不需要继承自 NSObject。事实上,它们也不应该从它继承,除非你希望能够使用 Obj-C 中的 Swift 类,在这种情况下你需要做@objc class Something: NSObject { ...
猜你喜欢
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多