Ответ 1
Короткий ответ:
-
Bool
- это собственный тип Swift для значений истинности. -
DarwinBoolean
- это Swift-отображение "исторического" типа CBoolean
. -
ObjCBool
- это Swift-отображение типа Objective-CBool
.
Вы использовали бы 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>
потому что это адрес переменной.