簡體   English   中英

如何使用Swift泛型傳遞類型並返回該類型的對象?

[英]How to use Swift generics to pass a type and return an object as that type?

我正在編寫一個函數,給定一個類型,只需從磁盤中取消歸檔對象並將其作為該類型返回。 這就是它的樣子:

public class func objectWithFileName<T>(fileName: String, inFolder folder: NSSearchPathDirectory) -> T? {
    // Build an NSURL var called fileURL based on the fileName and folder.
    // ...

    // If any object was found
    if let object: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(fileURL.path!) {
        // Attempt to return the object as an object of type T.
        if let typedObject = object as? T {
            return typedObject
        }
    }
    return nil
}

計划使用函數的方法是這樣,它不起作用(我得到“不能專門化非泛型定義”):

if let user = MQFileManager.objectWithFileName<User>("User", inFolder: .DocumentDirectory) {

}

我怎樣才能正確拉出它?

如果指定返回值的變量類型,則可以執行其余類型推斷。 因此,如果您有User類型,只需按如下方式調用該函數:

if let user: User = MQFileManager.objectWithFileName("User", inFolder: .DocumentDirectory) {

}

由於user變量屬於User類型,因此編譯器可以將T generic推斷為User類型

您需要將類型傳遞給參數

public class func objectWithFileName<T>(fileName: String, inFolder folder: NSSearchPathDirectory, type:T.Type) -> T? {
    // Your function detail
}

然后像這樣使用它

MQFileManager.objectWithFileName("User", inFolder: .DocumentDirectory, type:User.self)

我創建了一個通用類來幫助我在Swift中管理文件,我相信這可以幫助你解決問題。

這是我的加載方法

static func loadFile<T:TCFileData>(#name:String, classType:T.Type)->T!
{
    var data:T?;

    if(hasFile(name: name))
    {
        if let rawData = NSData(contentsOfFile: getPath(name) as String) {
            var object: AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithData(rawData);
            data = object as? T;
        }
    }

    return data;
}

static func loadFile<T:TCFileData>(classType:T.Type)->T!
{
    return loadFile(name: getFileName(classType), classType:classType);
}

我將此代碼上傳到GitHub存儲庫 ,有完整的類

履行

通過這個類,我調用了TCFile,你可以用這種方式在驅動器中保存很多類

 //TCFileData is a "protocol" to save with TCFile
 class MySaveClass:TCFileData
 {
   //implement your class with NSCode and NSCoding pattern
 }

 TCFile.save(name:"someId", object: MySaveClass());
 let mySaveClass = TCFile.loadFile(name:"someId", classType: MySaveClass.self);

或者其他簡單模式,如果你一直保存同一個對象,建議采用這種方式,你不需要來自這個對象的很多對象。

 let mySaveClass = MySaveClass()
 TCFile.save(mySaveClass)
 let mySaveClassFromDisc = TCFile.loadFile(MySaveClass.self)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM