当前位置: 首页 > 知识库问答 >
问题:

Xcode 9和Xcode 10给出了不同的结果,即使是相同的swift版本

养聪
2023-03-14

我在xcode 9.3和xcode 10 beta 3游乐场中都运行了这段代码

import Foundation

public protocol EnumCollection: Hashable {
    static func cases() -> AnySequence<Self>
}

public extension EnumCollection {

    public static func cases() -> AnySequence<Self> {
        return AnySequence { () -> AnyIterator<Self> in
            var raw = 0
            return AnyIterator {
                let current: Self = withUnsafePointer(to: &raw) { $0.withMemoryRebound(to: self, capacity: 1) { $0.pointee } }

                guard current.hashValue == raw else {
                    return nil
                }

                raw += 1
                return current
            }
        }
    }
}

enum NumberEnum: EnumCollection{
    case one, two, three, four
}

Array(NumberEnum.cases()).count

在Xcode9.3中,数组的大小为4

在xcode 10 beta 3上,数组的大小为0

我完全不明白这一点。

共有1个答案

姚雅珺
2023-03-14

这是一种获取所有枚举值序列的未记录的方法,只能偶然使用早期的Swift版本。它依赖于枚举值的哈希值是从零开始的连续整数。

这在Swift 4.2中肯定不再起作用(即使在Swift 4兼容模式下运行),因为哈希值现在总是随机化的,请参见SE-0206哈希增强:

为了降低哈希值的可预见性,标准哈希函数在默认情况下使用每次执行的随机种子。

您可以通过

print(NumberEnum.one.hashValue)
print(NumberEnum.two.hashValue)

它不会用Xcode 10打印01,但其他一些值也会随着程序的运行而变化。

有关正确的Swift 4.2/Xcode 10解决方案,请参见如何枚举字符串类型的枚举

extension NumberEnum: CaseIterable  { }
print(Array(NumberEnum.allCases).count) // 4
 类似资料:
  • 问题内容: 我在xcode 9.3和xcode 10 beta 3操场上都运行此代码 即使两者都使用Swift 4.1,但它们却给了我不同的结果 在 xcode 9.3 上,数组的大小为 4 在 xcode 10 beta 3 上,数组的大小为 0 我一点都不明白。 问题答案: 这是获取所有枚举值序列的一种未公开的方法,并且仅在偶然的早期Swift版本中才起作用。它依赖于枚举值的哈希值是从零开始的

  • 我在Cplex中使用Python API来解决一个线性编程问题。使用Cplex时,我的结果如下: 但随后我将LP prolem保存为LP文件,并再次使用Cplex进行求解,结果与第一个略有不同: 下面是我的功能:

  • 我试图通过HTTP向服务器发送一个SHA256哈希字符串,在那里我想通过执行SHA256哈希并验证两个匹配来进行身份验证。出于测试目的,我使用相同的字符串,但是结果不匹配。这可能是我的base64_encode调用的默认编码方案吗?谢谢 在PHP中,我正在做: 我在做什么

  • 让我们有一个简单的测试代码: 在Oracle/SUN中,java输出为(带空格): 4. 但在IBM java中,我得到了: 四千 我的java: java版本“1.7.0_51”java(TM)SE运行时环境(构建1.7.0_51-b13)java热点(TM)64位服务器虚拟机(构建24.51-b03,混合模式) IBM java: java版本java版本"1.6.0"Java(TM)SE运行

  • 问题内容: 我有一个导入一些servlet库的类。当我从命令行编译它时就可以了。 当我使用ant编译任务对其进行编译时,它会给出错误,即在其路径中找不到servlet库。 那是已知/常见的事件吗? 这是我的Ant目标: 问题答案: 如果您没有在任务的类路径中正确指定servlet库,这是一种常见的情况…我怀疑这就是问题所在。如果您发布失败的任务和有效的命令行,我们将为您提供更多帮助。

  • 我已经尝试使用cipher.getinstance(“rsa/ecb/pkcs1padding”),但没有给出预期的结果。 感谢所有的帮助。祝你有美好的一天。