【发布时间】:2017-08-20 09:32:33
【问题描述】:
今天我将 Xcode 6 升级到了 beta 5(从 beta 1),正如你想象的那样,我发现我以前完美运行的 Swift 应用程序充满了各种错误(嗯,与 beta 1 相比发生了很大变化)。在所有错误中,有一个我只是不知道如何修复。它与快速闭包有关,特别是 .enumerateGroupsWithTypes 方法的 enumerationBlock 参数。代码如下:
assetLib.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: {
(group: ALAssetsGroup?, stop: CMutablePointer<ObjCBool>) in
...
}, failureBlock: {
(error: NSError!) in
...
})
这确实在 Swift(Xcode 6 beta 1)中完美运行。但现在,我得到 2 个错误:
“‘UnsafeMutablePointer’不是‘错误类型’的子类型”
"使用未声明的类型'CMutablePointer'"
很明显 CMutablePointer 已经不存在了,所以我尝试修改 stop 参数:
..., stop: UnsafeMutablePointer<ObjCBool> ...
这个改动之后,第二个错误明显消失了,但是第一个变成了:
" 找不到接受提供的参数的 'init' 的重载"
我什至尝试按照this post 的建议将 UnsafeMutablePointer 更改为 UnsafePointer。
编辑:
这里是 enumerateGroupsWithTypes 方法的完整代码:
assetLib.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: {
(group: ALAssetsGroup?, stop: UnsafeMutablePointer<ObjCBool>) in
if group != nil {
group!.setAssetsFilter(ALAssetsFilter.allPhotos())
group!.enumerateAssetsAtIndexes(NSIndexSet(index: group!.numberOfAssets()-1), options: nil, usingBlock: {
(result: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) in
if result {
var alAssetRapresentation: ALAssetRepresentation = result.defaultRepresentation()
url = alAssetRapresentation.url()
}
})
}
else if group == nil {
assetLib.assetForURL(url, resultBlock: {
(asset: ALAsset!) in
if asset != nil {
var assetRep: ALAssetRepresentation = asset.defaultRepresentation()
var iref = assetRep.fullResolutionImage().takeUnretainedValue()
var image = UIImage(CGImage: iref)
imageView.image = image
self.view.addSubview(imageView)
let mask = CAShapeLayer()
mask.path = UIBezierPath(ovalInRect: CGRectMake(0, 0, 200, 200)).CGPath
mask.frame = CGPathGetPathBoundingBox(mask.path)
mapView.layer.mask = mask
self.view.addSubview(mapView)
}
}, failureBlock: {
(error: NSError!) in
NSLog("Error!", nil)
})
}
}, failureBlock: {
(error: NSError!) in
NSLog("Error!", nil)
})
【问题讨论】:
-
将
stop: CMutablePointer<ObjCBool>替换为stop: UnsafeMutablePointer<ObjCBool>后,您的代码将在我的项目中编译。是否还有更多可能导致问题的代码? -
首先,感谢您的快速回复...块内有很多东西。如果您的代码编译,我的代码中的错误可能隐藏在其他地方。我会在几分钟后发布完整方法的更新!
-
也许您可以将“很多东西”简化为一个展示问题的最小示例:)
-
问题是我不知道在这个“很多东西”中问题可能出在哪里......我对 ALAsset 的东西真的很陌生,我也不太熟悉闭包。我需要一些帮助:P
-
NSLog("Error!", nil)错误,应该是NSLog("Error!")。