我正试图将这个swift代码转换成Objective-C

convenience init(fromString string: String, format:DateFormat)
    {
        if string.isEmpty {
            self.init()
            return
        }

        let string = string as NSString

        switch format {

        case .DotNet:

            let startIndex = string.rangeOfString("(").location + 1
            let endIndex = string.rangeOfString(")").location
            let range = NSRange(location: startIndex, length: endIndex-startIndex)
            let milliseconds = (string.substringWithRange(range) as NSString).longLongValue
            let interval = NSTimeInterval(milliseconds / 1000)
            self.init(timeIntervalSince1970: interval)

到目前为止,我正在做的是:
-(id) initFromString: (NSString *) string format: (DateFormat *) format{
    if (string == nil) {
        self = [self init];
        return self;
    }


    switch (format) {
        case .DotNet:
            NSRange *startIndex = [[string rangeOfString:@"("] location]+1;

    }
}

并且已经遇到以下错误:
对于switch(format):语句,需要整数类型的表达式(DateFormat*\u strong'无效)
对于以下两行:应为表达式
有什么想法吗?

最佳答案

在Objective-C中,字符串隐含地是可选的。测试nil只测试是否提供了字符串。它不检查是否提供了空字符串。您可能希望切换到string.length == 0,因为借助nil消息的魔力,可以检查空字符串或根本没有字符串。
Objective-C使用Cswitch语句。所以你只能打开整型。如果这最初是Objective-C代码,DateFormat可能是一个NS_ENUM-一个整数类型,而不是一个对象类型。看起来原来是你使用点语法的枚举?如果您可以将其设为Objective-C枚举,那么这样做并简单地使用:

- (id)initFromString:(NSString *)string format:(DateFormat)format {
    ....
    switch(format)
    {
        case DateFormatDotNet: {
            ....
        } break;
    }

(其中case中的花括号是因为您希望在其中声明变量)。
否则,如果它必须是对象格式,那么您将看到一个痛苦的构造,如:
if([format isEqual:[DateFormat dotNetFormat]]) {
}
else if([format isEqual:[DateFormat otherFormat]]) {
}
... etc ...

Objective-C在structs和object类型之间也有语法上的区别,后者与C命名的字段完全相同,但没有内置的行为类型,这也是因为它是C的严格超集。所以方括号消息语法不起作用。而不是:
[[string rangeOfString:@"("] location]

使用:
[string rangeOfString:@"("].location

NSRange调用周围的方括号,因为它是一个对象的消息分派,然后是一个位置点,因为您返回一个C结构作为值,这就是访问C结构中字段的方式。
(dot语法也适用于Objective-C对象上的属性,但显式地适用于getter和setter调用的别名,而且仅适用于Objective-C三十年来的最新版本)

关于objective-c - 将带有Switch语句的Swift便捷初始化转换为Objective-C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36576953/

10-12 00:15
查看更多