2016-02-29 89 views
0

我有一個全局函數,它返回http請求的參數,頭文件和url。雖然標題和網址將始終是相同的類型,但參數不會。這取決於要求。 [[String:String]][String: Any]。我試圖使func具有通用性,但是我沒有工作,因爲我必須製作流程,而且它們並不總是符合這些類型。在我的函數中有一個開關a,在一些情況下,我應該使用arrayType,而在另一些情況下,我應該使用parameter的dictionaryType,然後返回它。所以這是一個問題。我怎樣才能定義parameter?或者我能做什麼?返回字典或數組函數?

任何建議都會讓我如此讚賞。

我試圖寫一個結構,這將使我能夠決定像這樣的參數類型;

struct parameterType<KeyType: Hashable, ValueType>{ 
    typealias arrayType = [[String:String]] 
    typealias dictionaryType = [String: Any] 
} 

但我找不出如何使用它。

這些是功能;

private func returnStaticDataForPostRequest<parameterType>(requestType: postRequestType, additionalParameters: [AnyObject]?) -> (url:NSURL, header:[String: String], parameter: [String: AnyObject]){} 

參數的函數的返回狀態有時要[String: AnyObject][String: Any]

再次任何幫助將讓我太高興了。

回答

1

您是否知道Endpoints?它是配置網絡請求參數(如URL,參數,方法等)的抽象層。你可以寫基地協議與默認的實現,例如:

protocol Endpoint { 

    var baseURL: String { get } 
    var path: String { get } 
    var headers: [RequestHeaders] { get } 
    var parameters: Parameters { get } 
    var requiresAuthorizationHeaders: Bool { get } 
} 

extension Endpoint { 

    var baseURL: String { 
     return "http://google.com" 
    } 

    var headers: [RequestHeaders] { 
     switch self { 
     default: return [] 
     } 
    } 

    var requiresAuthorizationHeaders: Bool { 
     return true 
    } 

    var parameterEncoding: ParameterEncoding { 
     return URLEncoding.default 
    } 
} 

然後,你需要在你的應用的每個請求創建端點,如果需要重寫屬性。對於您的要求,您需要編寫方式類似:

private func request(endpoint: RequestEndpoint) -> DataRequest { 
    let headers = self.headers(for: endpoint) 
    return Alamofire.request(URLForEndpoint(endpoint), 
          method: endpoint.method, 
          parameters: endpoint.parameters, 
          encoding: endpoint.parameterEncoding, 
          headers: headers) 
} 

你可以閱讀更多關於Moya框架回購這種方法,它使用的要求相同的技術。

+0

是的我現在正在使用Moya :) – Faruk

1

您可以使用具有關聯值的枚舉作爲返回值的一部分。例如,您可以使用:

enum ParameterTypeEnum { 
    case Dictionary(value: [String: Any]) 
    case Array(value: [[String:String]]) 
} 

您將有一個switch語句來提取參數並根據需要使用它們。我發現this網站在找出你可以用枚舉做什麼時非常有用。

+0

我已經考慮過你的答案了。我已經有一個開關條件。如果我再使用一個,我必須在主開關中使用它。應該有一個更好,有效的方法。 – Faruk