Доступ к CFBoolean, заключенному в NSString в Swift 4 - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть значение, которое приходит с сервера, оно сохраняется в переменную NSString (иногда сервер возвращает его в виде строки, иногда в виде логического значения).

Предположим, что эта часть кода не может быть изменена.

Проблема возникла, когда я переписал часть Objc на swift 4

Код, который у меня есть в Objc:

[data.isActive boolValue]

В swift 4 происходит сбой, поскольку в String нет записи .boolValue, вы можете преобразовать String в bool только с использованием синтаксиса Bool(). А так как значение не является реальной строкой, вызов Bool() разрешится в аварийных ситуациях из-за CFBoolean unrecognized selector, поскольку оно было принудительно перенесено из String.

Есть ли способ преодолеть это, не прибегая к Objc-коду, который обернул бы эти преобразования?

Пожалуйста, проверьте этот тестовый проект на GitHub

Не удается даже присвоить значение этого типа любому быстрому объекту.

1 Ответ

0 голосов
/ 06 ноября 2018

Objective-C очень нечувствителен к типу , с точки зрения BOOL 0, "0", "NO", ``false, "false" и даже nil равен false, все остальное рассматривается как true. Вот почему NSString имеет свойство boolValue. Он просто возвращает value != 0.

Swift - строго типизированный язык. Вы должны проверить тип:

let value : StringOrBool

let result : Bool
switch value {
  case let boolValue as Bool: result = boolValue
  case let stringValue as String: result = stringValue == "1" || stringValue == "true"
  default: result = false
}      
...