Подтвердить что ты не робот

Что такое тип DarwinBoolean в Swift

Я написал Boolean вместо Bool в некотором Swift-коде, и Xcode предложил мне заменить его на DarwinBoolean.

Вопрос: что такое DarwinBoolean?

Каковы различия по сравнению с типами Bool и ObjCBool. В чем цель?

4b9b3361

Ответ 1

Короткий ответ:

  • Bool - это собственный тип Swift для значений истинности.
  • DarwinBoolean - это Swift-отображение "исторического" типа C Boolean.
  • ObjCBool - это Swift-отображение типа Objective-C Bool.

Вы использовали бы Bool в своем коде Swift, если только один из других типов требуется для взаимодействия с существующим Core Foundation или Objective-C.


Подробнее о DarwinBoolean: DarwinBoolean определяется в Swift как

/// The `Boolean` type declared in MacTypes.h and used throughout Core
/// Foundation.
///
/// The C type is a typedef for `unsigned char`.
public struct DarwinBoolean : BooleanType, BooleanLiteralConvertible {
    public init(_ value: Bool)
    /// The value of `self`, expressed as a `Bool`.
    public var boolValue: Bool { get }
    /// Create an instance initialized to `value`.
    public init(booleanLiteral value: Bool)
}

и является Swift-отображением "исторического" типа C Boolean из MacTypes.h:

/********************************************************************************

    Boolean types and values

        Boolean         Mac OS historic type, sizeof(Boolean)==1
        bool            Defined in stdbool.h, ISO C/C++ standard type
        false           Now defined in stdbool.h
        true            Now defined in stdbool.h

*********************************************************************************/
typedef unsigned char                   Boolean;

См. также примечания к выпуску Xcode 7:

Тип Boolean в MacTypes.h импортируется как Bool в контекстах, которые разрешить переключение между типами Swift и Objective-C.

В случаях, когда представление является значительным, Boolean импортируется как отдельный тип DarwinBoolean, который является BooleanLiteralConvertible и может использоваться в условиях (как и тип ObjCBool). (19013551)

В качестве примера функции

void myFunc1(Boolean b);
void myFunc2(Boolean *b);

импортируются в Swift как

public func myFunc1(b: Bool)
public func myFunc2(b: UnsafeMutablePointer<DarwinBoolean>)

В myFunc1 происходит автоматическое преобразование между Тип Swift Bool и тип Mac Boolean. Это невозможно в myFunc2, потому что адрес переменной , здесь DarwinBoolean - это точно тип Mac Boolean.

В предыдущих версиях Swift - если я правильно помню - это сопоставлено type был вызван Boolean и позже был переименован в DarwinBoolean.


Подробнее о ObjCBool: ObjCBool - это Swift-отображение типа Objective-C Bool, это может быть signed char или тип C/С++ Bool, в зависимости от архитектура. Например, метод NSFileManager

- (BOOL)fileExistsAtPath:(NSString *)path
         isDirectory:(BOOL *)isDirectory

импортируется в Swift как

func fileExistsAtPath(_ path: String,
      isDirectory isDirectory: UnsafeMutablePointer<ObjCBool>) -> Bool

Здесь возвращаемое значение Bool преобразуется в Bool автоматически, но (BOOL *) сохраняется как UnsafeMutablePointer<ObjCBool> потому что это адрес переменной.

Ответ 2

К сожалению, нет реальной документации DarwinBoolean, кроме той части, которая была опубликована в первом ответе.

Но, как правило, пакет Darwin, который может быть импортирован seperatelly или доступен через пакет Foundation, используется, когда вы хотите использовать математические функции.

Значение DarwinBoolean совпадает с нормальным значением bool, true или false.