如何避免在 Swift 中重写初始化器?

How to avoid rewriting Initializers in Swift?

使用 Objective-C 我正在初始化我的 classes:

SomeClass *anInstance = [SomeClass new]

anInstance.importantInt = 4;
anInstance.importantString = @"Vip";
anInstance.importantDelegate = self;

[anInstance initialize];

我这样做是为了避免重写我的初始化程序,或者避免在 class 的持续开发过程中使用多个初始化程序和重复代码。我正在调用 -(void)initialize 来设置实例。

这样我就可以使用 dot-notation 分配属性,如果以后需要向 class 添加属性,只需添加一个新行即可。

为了避免将 -(void)initialize 添加到每个 header 我正在使用 NSObject 的扩展或我自己的 superclass 或协议来执行此操作。

因为我现在开始使用 swift,所以我问自己在 "personal design pattern" 中这样做是否仍然有意义。 swift 中是否有概念允许我轻松添加属性而无需重写初始值设定项以分配外部值?

我已经通读了 Apple 的 swift 指南并深入研究了 classes/structures 的初始化,但我真的不知道这些 swift 好处可以帮助我的任何情况在我的情况下。

您不应该在 class 的初始化器之外进行任何初始化。不过幸运的是,很容易避免重复代码。 Cocoa 有一个 "designated initializer" 的概念,它为 class 做所有必要的初始化; a class 可以有其他遵循指定初始化器的初始化器。在您的情况下,您的 class 将具有如下所示的指定初始化程序:

- (id)initWithInt:(NSInteger)i string:(NSString *)s
{
    if ((self = [super init])) {
        _importantInt = i;
        _importantString = [s copy];
    }
    return self;
}

然后它可能有一个 "convenience initializer" 看起来像这样:

- (id)init
{
    return [self initWithInt:4 string:@"Vip"];
}

因此,您可以将初始化完全封装在一个 class 中,而无需重复代码。

Swift 的运作原理类似。它允许你有多个初始化器。有的可以"designated initializers",有的可以"convenience initializers"。指定初始化程序通常会为 class 进行所有初始化。在您的情况下,它看起来像这样:

init(withInt i: Int, s: String) {
    self.importantInt = i
    self.importantString = s
}

便利初始化程序看起来像这样:

convenience init() {
    self.init(withInt: 4, string: "Vip")
}

与 Objective-C 一样,初始化仍然完全在 class 内完成,没有重复代码。