首页 文章

在Swift类的指定初始值设定项中调用实例方法

提问于
浏览
2

在Swift编程语言中,它是强制性的

“指定的初始化程序必须确保在委托一个超类初始化程序之前初始化其类引入的所有属性 . ”来自另一个s / o的引用源

否则,将显示类似于以下的错误

属性'self.baz'未在super.init调用中初始化

我想在Swift中实现以下Objective-C代码:

@interface FooBar : NSObject

@property (nonatomic, readonly) NSString *baz;

@end

@implementataion FooBar

@synthesize baz = _baz;

- (instancetype)initWithString:(NSString *)string {
    self = [super init];
    if (self) {
        _baz = [self parseString:string];
    }
    return self;
}

- (NSString *)parseString:(NSString *)string {
    // Perform something on the original string
    return ...;
}

@end

如上所述,以下实现会抛出编译器错误:

class FooBar: NSObject {
    let baz: NSString?

    init(string: NSString?) {
        super.init()
        baz = parseString(string)
    }

    private func parseString(string: NSString?) -> NSString? {
        // Perform something on the original string
        return ...;
    }
}

如果我做了以下操作,我会收到错误消息

在super.init初始化self之前,在方法调用'parseString'中使用self

class FooBar: NSObject {
    let baz: NSString?

    init(string: NSString?) {
        baz = parseString(string)
        super.init()
    }

    private func parseString(string: NSString?) -> NSString? {
        // Perform something on the original string
        return string;
    }
}

所以我现在的解决方案是使用私有类方法:

class FooBar: NSObject {
    let baz: NSString?

    init(string: NSString?) {
        baz = FooBar.parseString(string)
        super.init()
    }

    private class func parseString(string: NSString?) -> NSString? {
        // Perform something on the original string
        return ...;
    }
}

我的问题是,是否有更好的方法来实现相同或私有类方法的最佳方法?

1 回答

  • 1

    正如你正确提到的那样,编译器会抱怨"Use of self in method call 'parseString' before super.init initialises self" . 原因是编译器必须确保在完成初始化之前不访问 self 上的任何内容 . 因为编译器不希望(甚至不能)在初始化完成之前检查每个传出方法调用,所以它只是在完成之前不允许使用self .

    幸运的是,您的方法 parseString 不想更改或访问任何属性 . 因此,您可以而且应该使其成为非实例函数 . 如果它与 FooBar 的实例没有任何关系,为什么它只能在 FooBar 的实例上可用?

    您可以简单地将它设置为 staticclass 功能,这非常好 .

    但我会更进一步,将它完全移出 FooBar . 有几个选项:

    • 创建一个类 Helper ,您也可以将其定义为 class function

    • 创建一个类 Helper ,在其中将其定义为 instance function 并在类 FooBar 中创建 Helper 实例,或者创建一个全局实例并在init中传递该实例 .

相关问题