Начиная со Swift 4, идентификатор раскадровки является необязательным NSStoryboardSegue.Identifier
, который определяется как
extension NSStoryboardSegue {
public struct Identifier : RawRepresentable, Equatable, Hashable {
public init(_ rawValue: String)
public init(rawValue: String)
}
}
Вы можете включить его rawValue
:
switch segue.identifier?.rawValue {
case "showVC1"?:
// do something ...
default:
break
}
Однако рекомендуемый шаблон заключается в определении констант для каждого идентификатора раскадровки:
extension NSStoryboardSegue.Identifier {
static let showVC1 = NSStoryboardSegue.Identifier("showVC1")
// other storyboard identifiers ...
}
который затем можно сопоставить с:
switch segue.identifier {
case .showVC1?:
// do something ...
default:
break
}
В обоих примерах «необязательный шаблон» x?
(сокращение от .some(x)
) используется для сопоставления с необязательным значением.
Подобные типы были введены для других «идентификаторов», например. NSImage.Name
, который является типом аргумента NSImage(named:)
в Swift 4.
Для получения дополнительной информации см. обсуждение в списке рассылки swift-users, начиная с
Общая идея (насколько я понимаю) заключается в создании отдельных типов для каждого вида идентификатора. В частности (из https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20170717/005940.html):
... Мы намеренно не рекомендуем строковый литерал имени. Строковый литерал должен находиться только в одном месте: в определении константы имени. Все остальное должно использовать константу. Компилятор может обеспечить автодополнение и обнаружение опечаток в константе. Строковый литерал этого не понимает.
person
Martin R
schedule
05.08.2017