2016-04-25 89 views
-3

我讀了5個其他相關的questions具有相同的錯誤或syntax。據我所知,沒有任何事情與我的問題有關。不允許將非Objective-C指針類型「SEL」隱式轉換爲「NSString * _Nonnull」ARC

-(void) createCopyOfDBIfNeeded{ 
    NSFileManager *fileManager= [NSFileManager defaultManager]; 

    BOOL isDatabaseInCache = [fileManager fileExistsAtPath:@selector(getDBFile)]; 

    if (isDatabaseInCache) { 
     return; 
    } 
} 

// getDBFile方法:

-(NSString *) getDBFile { 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString * DBPath = [paths firstObject]; 
    NSString * DBFile = [DBPath stringByAppendingPathComponent:@"productDBFile.db"]; 
    return DBFile; 

} 

看來錯誤與@selector(getDBFile)。 如果我使用[self getDBFile]而不是一切正常,但我想要了解如何以及在何處使用@selector,以及錯誤/警告的含義。

我也得到一個警告:Incompatible pointer types sending 'SEL' to parameter of type

+4

您可能需要閱讀此:https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia -CocoaCore/Selector.html – jtbandes

+2

看起來你不知道選擇器是什麼,並且可能對函數的理解很少,以及如何調用它們。也許一個好的Objective-C引擎是有序的。 – Avi

+1

@ asma22注意Objective-C中的方法不應該以'get'作爲前綴,除非它們遵循一個通過參數通過引用返回的特定模式。 (共同點的困惑 - 歡迎來到這個語言,玩得開心!)。 – bbum

回答

2

您可以選擇只傳遞給需要選擇的方法。 fileExistsAtPath:需要NSString *,而不是SEL

它看起來像你想將getDBFile的返回值傳遞給fileExistsAtPath:而不是getDBFile的選擇器。

如果是這樣,只需撥打getDBFile而不是採取其選擇:

BOOL isDatabaseInCache = [fileManager fileExistsAtPath:[self getDBFile]]; 
+0

可以詳細說明你的第一行,我傳遞一個'SEL',它返回一個字符串,爲什麼不同於你的答案?你是否意味着該方法必須能夠接受某種'performSelector'輸入選項?我怎麼知道一個方法是否接受這種方法? – Honey

+0

@ asma22您正在將方法本身傳遞給需要方法結果的東西。 – NobodyNada

+2

@ asma22系統希望你傳遞它的文件名,但相反,你傳遞指令來獲取文件名,這是不期望的。我的例子遵循獲取文件名的說明,然後將結果傳遞給系統。那有意義嗎? – NobodyNada

相關問題