我怎样才能更好地转换我的代码

迈克·麦克拉伦

有人告诉我将代码从 obj-c 翻译成 swift。不幸的是,我只学习了 Swift。请帮我翻译。

对象-c:

struct {
    unsigned int didDoneClicked : 1;
    unsigned int didCancelClicked : 1;
  } _delegateFlags;

这就是我所做的:

struct _delegateFlags {
didDoneClicked: Int = 1
didCancelClicked: Int = 1
}

我真的不明白什么是“未签名”。告诉我如何使它更正确

路易斯拉克

整数类型可以有符号(带有负数和正数)或无符号(只有正数)。互联网上有很多关于整数类型的文档,你应该阅读它。

无符号整数通常用于存储计数器,因为它们总是正数。

Swift 中的等价物unsigned intUInt.

正确的方法是:

struct DelegateFlags {
  var didDoneClicked: UInt
  var didCancelClicked: UInt
}

请注意,您应该var在 Swift 中使用关键字。此外,如果您想匹配Swift 样式指南,您应该删除大写首字母的下划线。


笔记

这个结构看起来像一个 C 位域,用于以一种内存有效的方式存储布尔值,通过将信息存储在 1 位而不是 8 位。

如果你想匹配确切的 C 内存模式,Swift 的方法是:

struct DelegateFlags: OptionSet {
    var rawValue: UInt

    static let didDoneClicked = DelegateFlags(rawValue: 1 << 0)
    static let didCancelClicked = DelegateFlags(rawValue: 1 << 1)
}

但是,如果您需要一个更简单的结构,但比我介绍的第一个结构更有效,这里有一个替代方案:

struct DelegateFlags {
  var didDoneClicked: Bool
  var didCancelClicked: Bool
}

第一个结构是 16 字节,第二个是 8 字节(UInt8尽管可以做成 1 字节),最后一个是 2 字节。随着案例数量的增加,第二个将是最有效的(内存比最后一个少 8 倍,比第一个少 64 倍)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章