我正在尝试在Swift中初始化ALAssetsGroupType常量(Xcode 6.4。):
let groupTypes: ALAssetsGroupType = ALAssetsGroupType(ALAssetsGroupAll)
但它不能编译32位设备(例如,iPhone 5),我收到错误:
答案 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