我正试图将这个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在
struct
s和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/