Swift! = В инструкции switch - PullRequest
       60

Swift! = В инструкции switch

0 голосов
/ 27 апреля 2020

Я изучаю Swift и удивляюсь, почему следующий код выдает ошибку ('! =' Не является префиксным унарным оператором):

var name: String? = nil

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

Это работает, когда я использую if else:

var name: String? = nil

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

Как я могу изменить свой оператор switch, чтобы он работал? Заранее спасибо!

Ответы [ 5 ]

1 голос
/ 28 апреля 2020

Идиоматический c способ сделать это в Swift:

if let name = name {
    print("Hello \(name)")
} else {
    print("Hello, anonymous")
}
0 голосов
/ 28 апреля 2020

Вы не можете получить его настолько чистым, как вам нравится, но вы можете приблизиться.

Я люблю это и использую это все время. Так же как и этот популярный человек .

public func ~= <Value>(
  matchPattern: (Value) -> Bool,
  value: Value
) -> Bool {
  matchPattern(value)
}

Это позволяет

case { $0 != nil }

Другие примеры:

func test_Character() {
  let g: Character = "g"
  switch g {
  case \.isNumber, \.isHexDigit:
    XCTFail()
  case \.isLetter:
    break
  default:
    XCTFail()
  }
}

func test_Double() {
  switch 1.0 {
  case
    \.isZero,
    [2, 100, -0.3].contains,
    { $0 != 1 }
  :
    XCTFail()
  case \.isInteger:
    break
  default:
    XCTFail()
  }
}
0 голосов
/ 28 апреля 2020

Если вы действительно хотите использовать переключатель, который ведет себя как if-else, включите true:

switch true {
case name != nil :
    print("Hello \(name!)")
default :
    print("Hello, anonymous")
}
0 голосов
/ 28 апреля 2020

Почему не работает? Поскольку оператор switch должен иметь список значений для сравнения, а не выражения:

let number = 10

switch number {
case 1:
    print("one")
case 2:
    print("two")
default:
    print("too big for me")
}

Как исправить: Вы можете сделать то, что предложил @emlai, и использовать оператор if-let :

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

Или, если вам нужно использовать оператор switch, вы можете сделать любой из этих:

//this is as close as to what you are doing
switch name {
case _ where name != nil:
    print("Hello \(name!)")
default:
    print("Hello, anonymous")
}

//this binds name to a non-optional variable called actualName
switch name {
case let actualName where actualName != nil:
    print("Hello \(actualName)")
default:
    print("Hello, anonymous")
}

//this also binds name to actualName, but is more succinct
switch name {
case let actualName?:
    print("Hello \(actualName)")
default:
    print("Hello, anonymous")
}
0 голосов
/ 28 апреля 2020

Способ сделать это с помощью необязательного связывания ...

var name: String? = nil

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

Я бы рекомендовал прочитать больше об опциях и их использовании тоже ... https://developer.apple.com/documentation/swift/optional

...