0

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

对象-c:

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

这就是我所做的:

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

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

4

1 回答 1

3

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

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

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 字节(虽然可以做成 1 字节UInt8),最后一个是 2 字节。随着案例数量的增加,第二个将是最有效的(内存比最后一个少 8 倍,比第一个少 64 倍)。

于 2020-04-20T11:55:19.443 回答