gpt4 book ai didi

swift - 为什么我不能在 switch 语句中使用元组常量作为 case

转载 作者:搜寻专家 更新时间:2023-10-31 08:27:02 25 4
gpt4 key购买 nike

我决定尝试使用 Swift case 语句和元组。它看起来像是该语言最酷的功能之一。

我决定使用月/日/年元组。令我惊讶的是,我不能在 switch 语句中使用常量元组值作为 case。这是一个示例(可以粘贴到 Playground 中并运行)

import UIKit
typealias mdyTuple = (month: Int, day: Int, year: Int)
let joesBirthday: mdyTuple = (month: 6, day: 7, year: 1978)
let someday: mdyTuple = (6, 7, 1978)

switch someday
{
//---------
//The line "case joesBirthday" won't compile.
//case joesBirthday:
// println("Joe was born on this day"
//---------
case (joesBirthday.month, joesBirthday.day, joesBirthday.year):
println("Joe was born on this day")
case (joesBirthday.month, joesBirthday.day, let year):
println("Joe is \(year-joesBirthday.year) today")
default:
println("Some other day")
}

注释掉的代码 case joesBirthday: 将无法编译(在 Xcode 6.3 中,如果这很重要)。下面的案例(我分别列出了 joesBirthday 元组的所有元素)既难以键入又难以阅读,但确实有效)

我的 Playground 在输入此内容时使 Xcode 崩溃,并在尝试重新启动 Xcode 时再次崩溃,因此我无法报告错误代码。

好吧,我终于让 Xcode 停止崩溃(在连续崩溃 4 次之后。Yayyy!)错误是“二元运算符 ~= 不能应用于两个 mdyTuple 操作数。”

为什么要尝试使用 ~= 操作数?元组不是等价的吗?

是否有一些干净的替代语法可以让我在 switch 语句的情况下使用常量元组?

最佳答案

您可以像这样为 mydTuple 类型实现 ~= 运算符:

func ~=(a: mdyTuple, b: mdyTuple) -> Bool {
return a.month ~= b.month && a.year ~= b.year && a.day ~= b.day
}

这在 Playground 中对我有用...现在,这段代码

switch someday {
case joesBirthday:
println("one")
default:
println("two")
}

打印“一”。

这是运营商的定义:

infix operator ~= {
associativity none
precedence 130
}

并针对以下内容实现:

/// Returns `true` iff `pattern` contains `value`
func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
func ~=<T>(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
func ~=<T : Equatable>(a: T, b: T) -> Bool
func ~=<I : ForwardIndexType where I : Comparable>(pattern: Range<I>, value: I) -> Bool

关于swift - 为什么我不能在 switch 语句中使用元组常量作为 case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29677991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com