A partire da Xcode 7 beta 5 (Swift versione 2) è ora possibile stampare nomi di tipi ed enum case per impostazione predefinita utilizzando print(_:)
o convertire String
utilizzando String
l' init(_:)
inizializzatore o la sintassi di interpolazione delle stringhe. Quindi, per il tuo esempio:
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
}
let city = City.Melbourne
print(city)
// prints "Melbourne"
let cityName = "\(city)" // or `let cityName = String(city)`
// cityName contains "Melbourne"
Quindi non è più necessario definire e mantenere una funzione di convenienza che attiva ciascun caso per restituire una stringa letterale. Inoltre, questo funziona automaticamente per qualsiasi enum, anche se non viene specificato alcun tipo di valore non elaborato.
debugPrint(_:)
e String(reflecting:)
può essere utilizzato per un nome completo:
debugPrint(city)
// prints "App.City.Melbourne" (or similar, depending on the full scope)
let cityDebugName = String(reflecting: city)
// cityDebugName contains "App.City.Melbourne"
Si noti che è possibile personalizzare ciò che viene stampato in ciascuno di questi scenari:
extension City: CustomStringConvertible {
var description: String {
return "City \(rawValue)"
}
}
print(city)
// prints "City 1"
extension City: CustomDebugStringConvertible {
var debugDescription: String {
return "City (rawValue: \(rawValue))"
}
}
debugPrint(city)
// prints "City (rawValue: 1)"
(Non ho trovato il modo di chiamare questo valore "predefinito", ad esempio, per stampare "La città è Melbourne" senza ricorrere a un'istruzione switch. L'uso \(self)
nell'implementazione di description
/ debugDescription
provoca una ricorsione infinita.)
Le osservazioni di cui sopra String
's init(_:)
& init(reflecting:)
initializers descrivono esattamente ciò che viene stampato, a seconda di ciò che il tipo soddisfa riflesse a:
extension String {
/// Initialize `self` with the textual representation of `instance`.
///
/// * If `T` conforms to `Streamable`, the result is obtained by
/// calling `instance.writeTo(s)` on an empty string s.
/// * Otherwise, if `T` conforms to `CustomStringConvertible`, the
/// result is `instance`'s `description`
/// * Otherwise, if `T` conforms to `CustomDebugStringConvertible`,
/// the result is `instance`'s `debugDescription`
/// * Otherwise, an unspecified result is supplied automatically by
/// the Swift standard library.
///
/// - SeeAlso: `String.init<T>(reflecting: T)`
public init<T>(_ instance: T)
/// Initialize `self` with a detailed textual representation of
/// `subject`, suitable for debugging.
///
/// * If `T` conforms to `CustomDebugStringConvertible`, the result
/// is `subject`'s `debugDescription`.
///
/// * Otherwise, if `T` conforms to `CustomStringConvertible`, the result
/// is `subject`'s `description`.
///
/// * Otherwise, if `T` conforms to `Streamable`, the result is
/// obtained by calling `subject.writeTo(s)` on an empty string s.
///
/// * Otherwise, an unspecified result is supplied automatically by
/// the Swift standard library.
///
/// - SeeAlso: `String.init<T>(T)`
public init<T>(reflecting subject: T)
}
Vedi le note di rilascio per informazioni su questa modifica.
print(enum)
puoi usareString(enum)