【问题标题】:Xcode: Different behavior between swift Int and Objective-C intXcode:swift Int 和 Objective-C int 之间的不同行为
【发布时间】:2020-11-13 18:38:25
【问题描述】:

我正在尝试将Swift 函数转换为Objective-C。这是函数的签名

斯威夫特:

func hammingWeight(_ n: Int) -> Int

目标-C

-(int) hammingWeight:(int) number

我将此值传递给函数/方法:

00000000000000000000000000001011

在 Swift 的情况下,如果我打印 n 的值,它会打印:

p n
(Int) $R2 = 1011

在 Objective-C 的情况下打印这个:

p number
(int) $0 = 521

我对你们的问题是,为什么 Objective-C 会改变我传递的价值。对我来说完全是无稽之谈。你们中的任何人都知道为什么会发生这种情况,或者是否有办法解决这个问题?

非常感谢您对此提供的帮助。

这是完整的 Objective-C 实现:

@interface DoSomething : NSObject
@end

@implementation DoSomething

-(int) hammingWeight:(int) number {
    NSLog(@"number %d", number);
}

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        DoSomething *doIt = [DoSomething new];
        [doIt hammingWeight:00000000000000000000000000001011];
    }
}

【问题讨论】:

  • 1011 in oct 是 521 dec 所以确保你没有将它作为 oct 数传递给 objc 函数。
  • @HossamSherif 我已经添加了完整的objective-c实现
  • 是的,您将其作为 oct 发送 .. 尝试将 0xB 作为十六进制发送,将 1011 作为二进制发送,或者将 11 作为十进制发送。如果你想把它作为 oct 发送,1011 二进制是 013 oct

标签: ios objective-c swift iphone xcode11.4


【解决方案1】:

不同之处在于,在 (Objective-)c 中,由于前缀为 0,您给定的数字被解释为八进制,而在 Swift 中,它被解释为十进制。

对于 Swift 前缀 0o 中的八进制 Int 字面量。

Swift documentation 中有关八进制 Int 字面量的信息
c documentation中的八进制整数信息

// Swift:
(lldb) po 0o0000000000000000000000000001011;
521

(lldb) po 00000000000000000000000000001011;
1011

// Objective-C
(lldb) po 1011
1011

(lldb) po 01011
521

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多