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 中的第一个参数的主要内容,如果未能解决你的问题,请参考以下文章