【问题标题】:Returning Whether Dictionary or Array from function?从函数返回字典还是数组?
【发布时间】:2016-02-29 09:40:06
【问题描述】:

我有一个全局函数,它为 http 请求返回参数、标头和 url。虽然 headers 和 url 总是相同的类型,但参数不会。这取决于请求。[[String:String]][String: Any]。我试图使 func 通用,但我没有工作,因为我必须制作流程并且它们并不总是符合这些类型。我的函数中有开关 a ,在某些情况下我应该使用 arrayType 而在其他情况下我应该使用 dictionaryType 作为parameter 然后返回它。所以这就是问题所在;如何定义 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]

再次,任何帮助都会让我很高兴。

【问题讨论】:

    标签: ios swift generics swift2 return-type


    【解决方案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 框架 repo 中阅读有关此方法的更多信息,它对请求使用相同的技术。

    【讨论】:

      【解决方案2】:

      您可以使用带有关联值的枚举作为返回值的一部分。例如,您可以使用:

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

      您将有一个 switch 语句来提取参数并根据需要使用它们。我发现this 网站对于了解枚举可以做什么非常有用。

      【讨论】:

      • 我对您的回答稍作考虑。我已经有一个开关条件。如果我再使用一个,我必须在主开关的每个案例中都使用它。应该有更好、更有效的方法。
      猜你喜欢
      • 2018-05-15
      • 2019-11-22
      • 2011-05-01
      • 1970-01-01
      • 2019-03-23
      • 2015-06-05
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多