En Swift, hay un inicializador de cadenas que toma un UnsafePointer<Int8> (o UnsafePointer<CChar> que es lo mismo, creo) como argumento.

Sin embargo, no hay ningún inicializador que tome un UnsafePointer opcional, p. Ej. un puntero que es NULL (o nulo, hablando rápido), que puede ser extremadamente útil cuando se trabaja con una API C.

Me gustaría extender la clase String para aceptar punteros inseguros opcionales.

Así es como se ve mi extensión. ¿Es eso correcto? ¿Es así como se implementaría esa característica?

extension String {
    init?(cString: UnsafePointer<Int8>?) {
        guard let cString = cString else { return nil }
        self = String(cString: cString)
    }
}
4
user0800 1 oct. 2019 a las 14:32

1 respuesta

La mejor respuesta

Esta bien. Tiene un inicializador fallido que "falla" (devuelve nil) si el argumento dado es nil. De lo contrario, desenvuelve el argumento e inicializa la cadena asignando a self (lo que se puede hacer con los tipos struct).

CChar es de hecho del mismo tipo que Int8 en todas las plataformas de Apple (donde char es un carácter firmado ). Escribiría el tipo de argumento como UnsafePointer<CChar>? para enfatizar la conexión con el tipo char en C.

Una alternativa (solo ligeramente diferente) es

extension String {
    init?(cString: UnsafePointer<CChar>?) {
        guard let cString = cString else { return nil }
        self.init(cString: cString)
    }
}

Pero eso es puramente cuestión de gustos.

3
Martin R 1 oct. 2019 a las 12:03