Невозможно преобразовать значение типа Int в ожидаемый тип аргумента [CChar] (он же Array«) - PullRequest
0 голосов
/ 07 июня 2018

Я преобразовал фрагмент Objective-C в Swift во время перехода на Swift.Я все еще новичок в Objective-C, и у меня есть средние знания в Swift.Возникла проблема с удовлетворением аргумента C char, пытающегося преобразовать из Int8 в C Char.

class func computeSHA256Digest(for input: String?) -> String? {
    let cstr = Int8(input?.cString(using: .utf8) ?? 0)
    /* the rest of code */
}

Невозможно преобразовать значение типа 'Int' в ожидаемый тип аргумента '[CChar]' (он же Array)

1 Ответ

0 голосов
/ 07 июня 2018

Проблема в 0 после ??.Выражение input?.cString(using: .utf8) возвращает [CChar]?, поэтому при использовании ?? для предоставления значения по умолчанию, если результат равен nil, необходимо указать значение того же типа.Вам нужно [CChar], но вы передаете 0, что, конечно, Int.

Затем по какой-то причине вы пытаетесь создать Int8 из полученного [CChar].Это не сработает, поэтому вам нужно объяснить, почему вы пытаетесь это сделать.

Другое соображение состоит в том, что ваш параметр input является необязательным, а возвращаемое значение - необязательным.Возможно, если input равно nil, вам следует просто вернуть nil.

Я бы изменил код, который вы отправили:

class func computeSHA256Digest(for input: String?) -> String? {
    guard let input = input else { return nil }

    let cstr = input.cString(using: .utf8)!

    // The rest of the code
}

guard просто возвращает nilесли input равно nil.После guard есть локальная переменная с именем input, которая не является обязательной, поэтому вы можете напрямую получить ее значение cString.Можно принудительно развернуть результат cString, потому что вы никогда не получите nil с кодировкой .utf8.

На данный момент cstr имеет тип [CChar].

...