Как расширить UnsafePointer Stringинициализатор принимать указатели NULL? - PullRequest
4 голосов
/ 01 октября 2019

В Swift есть инициализатор String, который принимает UnsafePointer<Int8> (или UnsafePointer<CChar>, что, я думаю, тоже самое) в качестве аргумента.

Однако не существует инициализатора, который принимает необязательный UnsafePointer, например, указатель, который NULL (или ноль, если говорить быстро), который может быть чрезвычайно полезен при работе с C API.

Я бы хотел расширить класс String для принятия необязательных небезопасных указателей.

Так выглядит мое расширение. Это правильно? Это как реализовать эту функцию?

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

1 Ответ

3 голосов
/ 01 октября 2019

Отлично. У вас есть сбойный инициализатор, который «терпит неудачу» (возвращает nil), если задан аргумент nil. В противном случае он разворачивает аргумент и инициализирует строку, присваивая self (что можно сделать с типами struct).

CChar действительно совпадает с Int8 на всех платформах Apple (где char - это подписанный символ). Я бы написал тип аргумента как UnsafePointer<CChar>?, чтобы подчеркнуть связь с типом char в C.

Альтернатива (только немного другая) -

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

, но это чистодело вкуса.

...