- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 Xcode 10 中,Swift 编译器足够智能:
将包装 Hashable
值的 Optionals 视为 Hashable
。
Xcode >=9.4 还将处理包含所有 Hashable
的 struct
属性也是 Hashable
。
奇怪的是,即使构建语言是 Swift 4 甚至 Swift 3,Xcode 10 也会将 Optionals 视为 Hashable。
以下面的代码为例:
struct Foo: Hashable {
var string1: String?
var string2: String?
}
该代码在 Xcode 10 下编译,并且使用 Foo 对象的 hashValue 可以按预期工作,即使构建语言是 Swift 3!
但是,在 Xcode 9.4 中,除非您将属性设为非可选,否则 Foo 结构不会自动 Hashable。
此代码在 Xcode 9.4/Swift 4.1 中的编译和工作方式与您希望的一样:
struct Foo: Hashable {
var string1: String
var string2: String
}
我如何在 Xcode 9 中制作可选项 Hashable
?我当然可以自己为我的结构实现 Hashable
一致性,但是为多部分结构创建良好的哈希实际上有点棘手,我想不必担心它。
我也想不出一种直接的方法来制作可选的 Hashable
。 (同样,这只是 Xcode < Xcode 10 中的一个问题。我的雇主还没有迁移到 Xcode 10,所以我需要一个适用于 Xcode 9.4 的解决方案)
最佳答案
Swift 4.2 在中定义了条件 Optional: Hashable
一致性 Optional.swift作为
extension Optional: Hashable where Wrapped: Hashable {
// ...
public func hash(into hasher: inout Hasher) {
switch self {
case .none:
hasher.combine(0 as UInt8)
case .some(let wrapped):
hasher.combine(1 as UInt8)
hasher.combine(wrapped)
}
}
}
特别是
.none
与整数零具有相同的哈希值,独立于类型,和.some(wrapped)
是通过混合哈希值得到的用整数 1 包裹
。Swift 4.1(随 Xcode 9.4 一起提供)已经有了必要的工具来实现类似的方法:
条件一致性,即我们可以定义一个扩展
extension Optional: Hashable where Wrapped: Hashable
如果所有成员都是 Hashable
,则为类型自动合成 Hashable
。
这是一个可能的实现:
extension Optional: Hashable where Wrapped: Hashable {
struct Combiner: Hashable {
let left: Int
let right: Wrapped
}
public var hashValue: Int {
switch self {
case .none:
return 0.hashValue
case .some(let wrapped):
return Combiner(left: 1, right: wrapped).hashValue
}
}
}
例子:
struct Foo: Hashable {
var string1: String?
var string2: String?
}
let foo = Foo(string1: "1", string2: "2")
print(foo.hashValue) // 2171695307022640119
为了让这段代码也能在 Swift 4.2 及更新版本中编译,扩展方法可以有条件地编译(比较 SE-0212 Compiler Version Directive ):
#if swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0))
// Code targeting the Swift 4.2 compiler and above:
// Conditional conformance `Optional: Hashable` defined in the standard library.
#elseif swift(>=4.1) || (swift(>=3.3) && !swift(>=4.0))
// Code targeting the Swift 4.1 compiler and above:
extension Optional: Hashable where Wrapped: Hashable {
// ...
}
#endif
关于swift - 如何在 Xcode 9.4 中使 Optionals Hashable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218315/
我经常使用 var options = options || {} 作为默认为空对象的方式。它通常用于初始化选项对象,以防它未在函数调用的参数中传递。 问题是我在几个地方(博客文章、源代码)读到opt
我是Python中Rust的新手。这是我学习Rust的第四天。 在第一个问题Type casting for Option type之后,我有一个跟语法match和所有权概念有关的后续问题。 首先,我
我正在学习 Ray Wenderlich。我遇到了闭包语法错误。我想知道 Xcode 提示是什么意思? Xcode 报告如下: /Users/.../FlickrPhotosViewControlle
使用 Python 编写命令行界面 (CLI) 时 click library , 是否可以定义例如三个选项,其中仅当第一个(可选)未设置时才需要第二个和第三个选项? 我的用例是一个登录系统,它允许我
我有一个这样的 JPA 查询。 PersonRepository.java public Optional> findByStatus(int status); 人员服务.java System.ou
我遇到了很多地方,我有类似的东西 def f(s: String): Option[Long] = ... def g(l: Long): IO[Option[Wibble]] = ... val a
我有一个results: List[Future[Option[T]]]其中包含(并行)计算。 我想获得第一个非None尽快出结果,或者返回None如果所有计算都返回 None . 目前,我正在这样做
我正在尝试加载一个简单的 Listbox组件来自 @headlessui/react . 选择.tsx type Option = { id: number name: string
如何将Future[Option[Future[Option[X]]]]转换为Future[Option[X]]? 如果它是 TraversableOnce 而不是 Option 我会使用 Futur
Haskell、Rust 等语言提供了一个 Maybe 或 Option 类型。即使在 Java 中,也有一个 Optional 现在打字。 为简单起见,我将在剩下的问题中将此类型称为“选项类型”。
当我尝试在 SQL 中存储一个 XML 而不是一个空元素时,SQL 只是更改它并仅使用一个元素标签来存储它。例如,要存储的 XML 是: ROGER 然后Sql存起来就好了
使用这个非常好的命令行解析器 Argo(仅 header C++ 库)我遇到了一个小问题。请参阅:https://github.com/phforest/Argo Argo 返回:'Error: Un
我是来自 Java 背景的 Scala 新手,目前对考虑 Option[T] 的最佳实践感到困惑. 我觉得用 Option.map只是更实用和美观,但这不是说服其他人的好理由。有时, isEmpty
这个问题在这里已经有了答案: Chaining Optionals in Java 8 (9 个回答) Optional orElse Optional in Java (6 个回答) Functio
Optional::stream如果存在,则返回一个包含该值的 Stream,否则返回一个空流。所以对于 Stream> optionals , optionals.flatMap(Optional:
我使用箭头键作为输入,在 printf 菜单中上下移动 printf 箭头(“==>”)。 我正在使用一个函数来计算箭头应该在的位置,并使用 switch case 和 printf("\n==>")
这个问题在这里已经有了答案: What does the construct x = x || y mean? (12 个答案) 关闭 9 年前。 如我的问题标题所述,我最近偶然发现了这个变量声明:
这个问题在这里已经有了答案: BackboneJS: What is options || (options = {}); in Backbone source code (1 个回答) 关闭 8
我有这个简单的语法: word = Word(alphanums + '_') with_stmt = Suppress('with') + OneOrMore(Group(word('key') +
使用 Cucumber 和 SitePrism 编写测试,我在页面上有以下 HTML... Select a Status Active Product Inactive Prod
我是一名优秀的程序员,十分优秀!