gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:30:54 26 4
gpt4 key购买 nike

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

let groupTypes: ALAssetsGroupType = ALAssetsGroupType(ALAssetsGroupAll)

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

最佳答案

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

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

解释

如果您选择单击 ALAssetsGroupType你会看到它是 Int 的类型别名:

typealias ALAssetsGroupType = Int

但是,如果您随后单击 AssetsLibraryDeclared In 旁边,您会看到在头文件中它实际上是 NSUInteger 的类型定义。 :

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进入 Int32使用相同的位模式。然后将其转换为 ALAssetsGroupType这只是一个 Int , 所以在 32 位系统上你会得到一个 Int设置所有位(这是 -1 的表示)。在 64 位系统上,Int32 -1 的值将符号扩展到 -1在 64 位中设置值的所有 64 位。

另一种解决方法是定义你自己的AllGroups :

let AllGroups = -1  // all bits set
let groupTypes: ALAssetsGroupType = AllGroups

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

typedef NSUInteger ALAssetsGroupType NS_DEPRECATED_IOS(4_0, 9_0, "Use PHAssetCollectionType and PHAssetCollectionSubtype in the Photos framework instead");

关于xcode - 如何在 Swift 中初始化 ALAssetsGroupType 常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com