Swift 斯威夫特!=in-switch语句

Swift 斯威夫特!=in-switch语句,swift,switch-statement,Swift,Switch Statement,我正在学习Swift,不知道为什么下面的代码会产生错误(“!=”不是前缀一元运算符): 当我使用if-else时,它会起作用: var name: String? = nil if name != nil { print("Hello \(name!)") } else { print("Hello, anonymous") } 如何更改switch语句以使其工作?提前谢谢你 实现这一点的方法是使用可选绑定 var name: String? = nil switch na

我正在学习Swift,不知道为什么下面的代码会产生错误(“!=”不是前缀一元运算符):

当我使用if-else时,它会起作用:

var name: String? = nil

if name != nil {
    print("Hello \(name!)")
}
else {
    print("Hello, anonymous")
}

如何更改switch语句以使其工作?提前谢谢你

实现这一点的方法是使用可选绑定

var name: String? = nil

switch name {
case let actualName? :
    print("Hello \(actualName)")
default :
    print("Hello, anonymous")
}

我建议你多读一些关于可选的和它们的用法

在Swift中这样做的惯用方法是:

if let name = name {
    print("Hello \(name)")
} else {
    print("Hello, anonymous")
}

为什么它不起作用?因为switch语句应该具有要比较的值列表,而不是表达式:

let number=10
开关号{
案例1:
打印(“一”)
案例2:
打印(“两个”)
违约:
打印(“对我来说太大”)
}

如何修复:您可以按照@emlai的建议执行,并使用
if let
语句:

如果让name=name{
打印(“你好\(姓名)”)
}否则{
打印(“你好,匿名”)
}
或者,如果需要使用switch语句,可以执行以下任一操作:

//这与您正在做的事情非常接近
交换机名称{
案例uuName!=nil:
打印(“你好\(姓名!)”)
违约:
打印(“你好,匿名”)
}
//这会将名称绑定到名为actualName的非可选变量
交换机名称{
case let actualName,其中actualName!=nil:
打印(“你好\(实际名称)”)
违约:
打印(“你好,匿名”)
}
//这也将名称绑定到实际名称,但更简洁
交换机名称{
案例名称:
打印(“你好\(实际名称)”)
违约:
打印(“你好,匿名”)
}

如果您确实想使用一个与If-else类似的开关,请打开
true

switch true {
case name != nil :
    print("Hello \(name!)")
default :
    print("Hello, anonymous")
}

你不能把它弄得像你喜欢的那样干净,但你可以靠近它

我喜欢这个并且一直使用它。我也是

public func~=(
匹配模式:(值)->Bool,
价值:价值
)->布尔{
匹配模式(值)
}
这就允许

case{$0!=nil}
其他例子:

func测试字符(){
设g:Character=“g”
开关g{
案例\.isNumber,\.ishxDigit:
XCTFail()
案例\.Isleter:
打破
违约:
XCTFail()
}
}
func-test_-Double(){
开关1.0{
案例
\.是零,
[2100,-0.3]。包含,
{ $0 != 1 }
:
XCTFail()
案例\.isInteger:
打破
违约:
XCTFail()
}
}

Swift
switch
语句不接受部分任意表达式。这个错误总结了它——你不能把
=在“自身”值前面创建一个有效的
大小写
值。我知道这并不能回答您的具体问题。也许你以前见过这些。但是,考虑另一种方法来编写这个逻辑,而不是I/OR或切换,在一行中,使用:<代码>打印(“hello”,+(name??)匿名))< /代码>。
??
运算符本身是三元运算符的特定用法的简写,当应用于零检查时:
c=(a??b)
=>
c=(a!=nil?a!:b)
=>
如果a!=nil{c=a!}else{c=b}
。这将
实际名称
绑定到一个可选名称,因此将永远不会达到默认的
实际名称
最后需要一个
来打开该可选名称。谢谢,但这实际上是打印“Hello nil”而不是“Hello,anonymous”。。。我一定会做一些阅读虽然,谢谢你的链接!谢谢Fogmeister和@Alexander Monica,下面的代码有效:var name:String?=nil开关名称{case let actualName?:print(“Hello(actualName)”)默认值:print(“Hello,匿名”)}@Alexander@monica我不同意“假定的”。看看我的答案。测试关键路径尤其重要。
switch true {
case name != nil :
    print("Hello \(name!)")
default :
    print("Hello, anonymous")
}