gpt4 book ai didi

objective-c - 将带有 Switch 语句的 Swift convenience init 转换为 Objective-C

转载 作者:行者123 更新时间:2023-11-28 12:50:51 25 4
gpt4 key购买 nike

我正在尝试将此 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 * __strong'无效)

以及以下两行:预期表达式

有什么想法吗?

最佳答案

在 Objective-C 中,字符串隐含地是可选的。测试 nil 仅测试是否提供了字符串。它不检查是否提供了空字符串。您可能想切换到 string.length == 0,因为借助 nil-messaging 的魔力,它可以检查空字符串或根本没有字符串。

Objective-C 使用 C 的 switch 语句。所以你只能打开整数类型。如果这是最初的 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 和对象类型之间有句法区别,这正是它们在 C 中的含义——命名字段但没有内置行为——这又是因为它是一个C 的严格超集。NSRange 是一个结构。所以方括号消息传递语法不适用于它。而不是:

[[string rangeOfString:@"("] location]

使用:

[string rangeOfString:@"("].location

rangeOfString 调用周围加上方括号,因为它是一个发送给对象的消息,然后是一个点表示位置,因为您返回一个 C 结构作为值,这就是访问一个字段的方式C 结构。

(点语法也适用于 Objective-C 对象的属性,但明确地作为 getter 和 setter 调用的别名,并且仅适用于 Objective-C 的近三年)

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com