如何在Swift中初始化ALAssetsGroupType常量?

时间:2015-07-14 11:20:31

标签: xcode swift alassetslibrary

我正在尝试在Swift中初始化ALAssetsGroupType常量(Xcode 6.4。):

let groupTypes: ALAssetsGroupType = ALAssetsGroupType(ALAssetsGroupAll)

但它不能编译32位设备(例如,iPhone 5),我收到错误: enter image description here

1 个答案:

答案 0 :(得分:3)

可能有更好的方法,但直接的方法是使用Int32的构造函数从Int32创建签名的UInt32

let groupTypes: ALAssetsGroupType = ALAssetsGroupType(Int32(bitPattern: ALAssetsGroupAll))

说明

如果您选择ALAssetsGroupType,则会看到它是Int的类型:

typealias ALAssetsGroupType = Int

但是,如果您再单击声明的旁边的AssetsLibrary,您会在头文件中看到它实际上是NSUInteger的typedef:

<强> ALAssetsLibrary.h

typedef NSUInteger ALAssetsGroupType;

那么,这里发生了什么?为什么Swift不将NSUInteger视为UInt? Swift是一种强类型语言,这意味着您无法在不转换的情况下将Int分配给UInt。为了让我们的生活更简单,并删除许多转化,Swift工程师决定将NSUInteger视为Int,这可以在大多数情况下节省很多麻烦

下一部分的谜团是ALAssetsGroupAll

的定义
enum {
    ALAssetsGroupLibrary        = (1 << 0),         // The Library group that includes all assets.
    ALAssetsGroupAlbum          = (1 << 1),         // All the albums synced from iTunes or created on the device.
    ALAssetsGroupEvent          = (1 << 2),         // All the events synced from iTunes.
    ALAssetsGroupFaces          = (1 << 3),         // All the faces albums synced from iTunes.
    ALAssetsGroupSavedPhotos    = (1 << 4),         // The Saved Photos album.
#if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
    ALAssetsGroupPhotoStream    = (1 << 5),         // The PhotoStream album.
#endif
    ALAssetsGroupAll            = 0xFFFFFFFF,       // The same as ORing together all the available group types,
};

请注意ALAssetsGroupAll旁边的评论说"The same as ORing together all the available group types"。好吧,0x3F已经足够了,但可能是作者决定设置所有位以便将来证明它以防将来添加其他选项。

问题是虽然0xFFFFFFFF适合NSUInteger,但它并不适合Int32,因此您会在32位系统上收到溢出警告。上面提供的解决方案将UInt32 0xFFFFFFFF转换为具有相同bitPattern的Int32。然后转换为ALAssetsGroupType只是Int,因此在32位系统上,您获得Int所有位设置(这是{{1}的表示})。在64位系统上,-1的{​​{1}}值在64位中被符号扩展为Int32,这将设置值的所有64位。

另一种解决方法是定义自己的-1

-1

请注意,这在iOS 9中已弃用:

AllGroups