ALAssetsLibrary.enumerateGroupsWithTypes Swift 中的第一个参数

ALAssetsLibrary.enumerateGroupsWithTypes first parameter in Swift

提问人:Morniak 提问时间:7/9/2014 更新时间:9/17/2014 访问量:2338

问:

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

该方法的原型:

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)

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

iOS Swift 资产库

评论

0赞 Jack 7/9/2014
这不是一个枚举吗?如果是这样,您需要传入或仅 .ALAssetsGroup.All.All
2赞 Morniak 7/9/2014
它不是 Objective-C 中的枚举:var ALAssetsGroupAll: CUnsignedInt { get } typealias ALAssetsGroupType = Int
2赞 Jack 7/9/2014
明白了。。。看起来像是他们使用而不是翻译器坏了的情况之一......错误报告!enumNS_ENUM

答:

-1赞 gotnull 7/10/2014 #1

这似乎编译了:

虽然,它未经测试,因为我不知道它到底返回了什么.allZeros

它可能会返回与您需要的相反的返回,即 .0x000000xFFFFFF

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

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 提到他们可能在哪里使用而不是使用并且翻译器坏了一样。enumNS_ENUM

目前,这样做可能是一种解决方法。

资产类型

用于标识资产类型的常量。

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

评论

0赞 Morniak 7/10/2014
ALAssetsGroupType.allZerosreturn 而我要使用的选项的值是 。因此,它会编译但不产生预期的结果(未设置任何位,因此结果将始终为空数组)。0x000000xFFFFFF
0赞 gotnull 7/11/2014
@Morniak 请参阅我更新的答案。你有没有试过作为?0xFFFFFFFFALAssetsGroupType
0赞 Morniak 7/11/2014
是的,它有效,这就是我正在做的事情,但这不是一个可行的解决方案。 是一个神奇的数字,如果由于任何原因 Apple 更改此枚举的值,我的应用程序将被破坏。0xFFFFFFFF
0赞 gotnull 7/14/2014
@Morniak:是的,没错。这就是为什么我提到这样做暂时可能是一种解决方法。
1赞 Mike Akers 9/17/2014 #2

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

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