ALAssetsLibrary.enumerateGroupsWithTypes Swift 中的第一个参数

Posted

技术标签:

【中文标题】ALAssetsLibrary.enumerateGroupsWithTypes Swift 中的第一个参数【英文标题】:ALAssetsLibrary.enumerateGroupsWithTypes first parameter in Swift 【发布时间】:2014-07-09 13:33:39 【问题描述】:

我尝试使用ALAssetsLibrary 类的enumerateGroupsWithTypes 方法,但第一个参数出现错误。

方法的原型:

func enumerateGroupsWithTypes(types: ALAssetsGroupType,
    usingBlock enumerationBlock: ALAssetsLibraryGroupsEnumerationResultsBlock!,
    failureBlock: ALAssetsLibraryAccessFailureBlock!)

我如何称呼这个方法:

assetLib.enumerateGroupsWithTypes(ALAssetsGroupAll, usingBlock: success, failureBlock: fail)

但我得到一个编译错误'CUnsignedInt' is not convertible to 'ALAssetsGroupType'

其他测试:

根据我在互联网上的发现和我自己的测试,我也尝试过

测试 1

assetLib.enumerateGroupsWithTypes(ALAssetsGroupAll as ALAssetsGroupType, usingBlock: success, failureBlock: fail)

结果是编译错误Cannot convert the expression's type 'Void' to type 'ALAssetsGroupType'

测试 2

assetLib.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAll), usingBlock: success, failureBlock: fail)

结果是运行时错误EXC_BAD_ACCESS 和 XCode 崩溃。

【问题讨论】:

不是枚举吗?如果是这样,您需要传入ALAssetsGroup.All 或只是.All 它不是 Objective-C 中的枚举:var ALAssetsGroupAll: CUnsignedInt get typealias ALAssetsGroupType = Int 我明白了...看起来像是他们使用enum 而不是NS_ENUM 的情况之一,而且翻译器坏了...错误报告! 【参考方案1】:

看起来正确的方法是使用ALAssetsGroupType的初始化器来创建一个新的ALAssetsGroupType。以下应该有效:

assetLib.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAll), usingBlock: success, failureBlock: fail)

【讨论】:

【参考方案2】:

这似乎可以编译:

不过,它未经测试,因为我不知道allZeros 返回的确切内容。

它可能返回0x00000,而不是您需要的0xFFFFFF

对于未来的人们来说,仍然可能是一个很好的参考。

let assetLib = ALAssetsLibrary()
assetLib.enumerateGroupsWithTypes(ALAssetsGroupType.allZeros, usingBlock:  (results, stop) in
    println(results)
, failureBlock:  (fail) in
    println(fail)
)

编辑:

那么,如果您执行以下操作会发生什么?

assetLib.enumerateGroupsWithTypes(0xFFFFFFFF, usingBlock: ...)

我得到以下信息:

(ALAssetsGroup - Name:Instagram, Type:Album, Assets count:46, )
(ALAssetsGroup - Name:Snapchat, Type:Album, Assets count:0, )
(ALAssetsGroup - Name:Camera Roll, Type:Saved Photos, Assets count:681, )
(nil, )

这可能是 Jack Wu 提到的错误,他们可能使用了 enum 而不是 NS_ENUM,并且翻译器坏了。

暂时这样做可能是一种解决方法。

资产类型

标识资产类型的常量。

enum 
   ALAssetsGroupLibrary        = (1 << 0),
   ALAssetsGroupAlbum          = (1 << 1),
   ALAssetsGroupEvent          = (1 << 2),
   ALAssetsGroupFaces          = (1 << 3),
   ALAssetsGroupSavedPhotos    = (1 << 4),
   ALAssetsGroupPhotoStream    = (1 << 5),
   ALAssetsGroupAll            = 0xFFFFFFFF,
;

【讨论】:

ALAssetsGroupType.allZeros return 0x00000 而我想使用的选项的值是0xFFFFFF。所以它编译但不会产生预期的结果(没有设置任何位,因此结果将始终是一个空数组)。 @Morniak 查看我的更新答案。您是否尝试过将0xFFFFFFFF 用作ALAssetsGroupType 是的,它有效,这就是我正在做的,但这不是一个可行的解决方案。 0xFFFFFFFF 是一个神奇的数字,如果苹果出于任何原因更改此枚举的值,我的应用程序将被破坏。 @Morniak:是的,没错。这就是为什么我提到暂时这样做可能是一种解决方法。

以上是关于ALAssetsLibrary.enumerateGroupsWithTypes Swift 中的第一个参数的主要内容,如果未能解决你的问题,请参考以下文章