ho trovato il seguente codice compila e funziona:String valore al UnsafePointer comportamento parametro <UInt8> funzione
func foo(p:UnsafePointer<UInt8>) {
var p = p
for p; p.memory != 0; p++ {
print(String(format:"%2X", p.memory))
}
}
let str:String = "今日"
foo(str)
Questo stampa E4BB8AE697A5
e che è una rappresentazione UTF-8 valida 今日
Per quanto ne so, questo è un comportamento non documentato. da the document:
Quando una funzione è dichiarata come prendere un argomento UnsafePointer, può accettare qualsiasi dei seguenti:
- zero, che viene passato come un puntatore nullo
- Un UnsafePointer, UnsafeMutablePointer, o AutoreleasingUnsafeMutablePointer value, che viene convertito in UnsafePointer se necessario
- Un'espressione in-out il cui operando è un lvalue di tipo Type, che viene passato come indirizzo del lvalue
valore- A [Tipo], che è passato come puntatore all'inizio dell'array, e la durata, estesa per tutta la durata della chiamata
In questo caso, è non str
di loro.
Mi manca qualcosa?
aggiunto:
E non funziona se il tipo di parametro è UnsafePointer<UInt16>
func foo(p:UnsafePointer<UInt16>) {
var p = p
for p; p.memory != 0; p++ {
print(String(format:"%4X", p.memory))
}
}
let str:String = "今日"
foo(str)
//^'String' is not convertible to 'UnsafePointer<UInt16>'
Anche se il String
rappresentazione interna è UTF16
let str = "今日"
var p = UnsafePointer<UInt16>(str._core._baseAddress)
for p; p.memory != 0; p++ {
print(String(format:"%4X", p.memory)) // prints 4ECA65E5 which is UTF16 今日
}
Sembra che sia l'ultimo, no? – Mundi
Penso, no.'String' non è' Array ' –
rintaro
Intendevo dire la penultima. È proprio come una variabile in-out. Forse la dicitura ** "che è passata" ** non è chiara. Potrebbe significare "questo è il modo in cui la funzione interpreterà questo argomento" (che penso sia inteso) o "questo è ciò che devi passare" (che credo non sia inteso qui). – Mundi