一種解決方法報告這個錯誤是在Xcode 8.1的release notes中提供。引用的發行說明:
SDK中的一些目標C的方法可能會錯誤地註釋或 假設類型是nonnull
而非nullable
。甲類型夫特 將其視爲一個結構,如NSURL
(Foundation.URL
)或NSDate
(Foundation.Date
),導致在方法的運行時間的碰撞與名稱 像bridgeFromObjectiveC
;在其他情況下,它可能會導致用戶代碼中的未定義行爲崩潰或不可用。如果您確定了這樣一種方法,請 在bugreport.apple.com上提交報告。解決方法是,在Objective-C中添加一個 蹦牀函數,註釋的正確可空性爲 。例如,下面的函數可以讓你 通話 FileManager
的enumerator(at:includingPropertiesForKeys:options:errorHandler:)
方法與接受nil
網址錯誤處理:
static inline NSDirectoryEnumerator<NSURL *> * _Nullable
fileManagerEnumeratorAtURL(NSFileManager *fileManager, NSURL * _Nonnull url, NSArray<NSURLResourceKey> * _Nullable keys, NSDirectoryEnumerationOptions options, BOOL (^ _Nullable errorHandler)(NSURL * _Nullable errorURL, NSError * _Nonnull error)) {
return [fileManager enumeratorAtURL:url includingPropertiesForKeys:keys options:options errorHandler:^(NSURL * _Nonnull errorURL, NSError * _Nonnull error) {
return errorHandler(errorURL, error);
}];
}
此功能可以包含在你的橋接報頭(用於應用程序或測試目標)或傘頭(用於框架目標)。 (27749845)
要採取的步驟:
1)添加一個新的.m文件到您的項目稱爲DirectoryEnumeratorGlue.m。當你添加它時,Xcode會問你是否要爲它創建一個橋接頭,是的。放入DirectoryEnumeratorGlue.m如下:
NSDirectoryEnumerator<NSURL *> * _Nullable
fileManagerEnumeratorAtURL(NSFileManager * _Nonnull fileManager, NSURL * _Nonnull url, NSArray<NSURLResourceKey> * _Nullable keys, NSDirectoryEnumerationOptions options, BOOL (^ _Nullable errorHandler)(NSURL * _Nullable errorURL, NSError * _Nonnull error)) {
return [fileManager enumeratorAtURL:url includingPropertiesForKeys:keys options:options errorHandler:^(NSURL * _Nonnull errorURL, NSError * _Nonnull error) {
return errorHandler(errorURL, error);
}];
}
2)添加一個新的.h文件到您的項目,名爲DirectoryEnumeratorGlue.h。將以下內容放在DirectoryEnumeratorGlue中。H:
extern NSDirectoryEnumerator<NSURL *> * _Nullable
fileManagerEnumeratorAtURL(NSFileManager * _Nonnull fileManager, NSURL * _Nonnull url, NSArray<NSURLResourceKey> * _Nullable keys, NSDirectoryEnumerationOptions options, BOOL (^ _Nullable errorHandler)(NSURL * _Nullable errorURL, NSError * _Nonnull error));
3)以下添加到您的橋接報:
#import <Foundation/Foundation.h>
#import "DirectoryEnumeratorGlue.h"
4)更換呼叫FileManager.default.enumerator在您電話斯威夫特像這樣的東西:
let enumerator = fileManagerEnumeratorAtURL(FileManager.default, url, [], [], {
(errorURL, error) in
return true
})
你能展示可破解的代碼嗎? – matt
@matt好吧,這是一個已知的bug。可支付代碼中沒有任何東西可以回答這個問題。沒有必要downvote。這沒有幫助。但是,這個問題的答案(即如何避免枚舉不可訪問的文件夾)可以幫助其他人。 – Adeline
看到導致崩潰的代碼仍然很有幫助,並且可能引用了您正在討論的錯誤。 (你不知道這是否是啞光投影,順便說一句) –