Swift 斯威夫特!=in-switch语句
我正在学习Swift,不知道为什么下面的代码会产生错误(“!=”不是前缀一元运算符): 当我使用if-else时,它会起作用: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
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()
}
}
Swiftswitch
语句不接受部分任意表达式。这个错误总结了它——你不能把=代码>在“自身”值前面创建一个有效的大小写
值。我知道这并不能回答您的具体问题。也许你以前见过这些。但是,考虑另一种方法来编写这个逻辑,而不是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")
}