如何在swift中创建一个字符串和函数作为键值对的字典

时间:2016-08-17 06:33:40

标签: swift dictionary

我希望创建一个具有

的字典
let urlDict:[String:Func] = ["LOGIN":getLoginURL(), "RESET":getResetPasswordURL()]

func getLoginURL() -> String{
        if (sandbox == true){
            return sb_login_url
        }else{
            return live_login_url
        }
    }


    func getResetPasswordURL() -> String{
        if (sandbox == true){
            return sb_reset_url
        }else{
            return live_reset_url
        }

    }

此dict的目的是根据KEY获取/映射函数,并且必须调用相应函数KEY,然后返回返回URL。

我已尝试命名字典,但我无法做到

let urlDict:[String:Func] = ["LOGIN":getLoginURL(), "RESET":getResetPasswordURL()]
let urlDict:[String:Function] = ["LOGIN":getLoginURL(), "RESET":getResetPasswordURL()]
let urlDict:[String:Functions] = ["LOGIN":getLoginURL(), "RESET":getResetPasswordURL()]

编辑1

 class Constants{
       private let sb_login_url = "http://IP_ADDRESS_COM/login_with_credentials"
        private let live_login_url = "http://google.com"


        private let sb_reset_url = "http://IP_ADDRESS_COM/forgot_password"
        private let live_reset_url = "http://google.com"


        func getLoginURL() -> String{
            if (sandbox == true){
                return sb_login_url
            }else{
                return live_login_url
            }
        }


        func getResetPasswordURL() -> String{
            if (sandbox == true){
                return sb_reset_url
            }else{
                return live_reset_url
            }

        }
  `    let urlDict: [String: () -> String] = ["LOGIN": Constants.getLog‌​inURL(), "RESET":Constants.getResetPasswordURL()]

    if let getFunc = urlDict[url_key] {
                let url = (getFunc()) // foo}


}

2 个答案:

答案 0 :(得分:1)

您必须为字典中的getLoginURL广告位指定函数的类型(对于getResetPasswordURLvalue都是通用的),即() -> String,零-arguments函数返回String实例。

func getLoginURL() -> String {
    return "foo"
}

func getResetPasswordURL() -> String {
    return "bar"
}

let urlDict: [String: () -> String] = 
    ["LOGIN": getLoginURL, "RESET":getResetPasswordURL]
/*            ^^^^^^^^^^^- note that you do not _call_ the functions,
                           as this would result in a String instance */ 

// get a function reference from the dictionary and invoke it
if let getFunc = urlDict["LOGIN"] {
    print(getFunc()) // foo
}

在您的评论以及编辑之后,如果您的班级get...(即标记为Constants),您似乎希望static函数成为班级成员。

class Constants {
    static var sandbox = true
    // I've just added this to test your example

    private static let sb_login_url = "http://IP_ADDRESS_COM/login_with_credentials"
    private static let live_login_url = "http://google.com"

    private static let sb_reset_url = "http://IP_ADDRESS_COM/forgot_password"
    private static let live_reset_url = "http://google.com"

    static func getLoginURL() -> String {
        if (Constants.sandbox == true){
            return Constants.sb_login_url
        } 
        else {
            return Constants.live_login_url
        } 
    }

    static func getResetPasswordURL() -> String{
        if (Constants.sandbox == true){
            return Constants.sb_reset_url
        } 
        else {
            return Constants.live_reset_url
        }
    }
}

let urlDict: [String: () -> String] = 
    ["LOGIN": Constants.getLoginURL, "RESET": Constants.getResetPasswordURL]

// get a function reference from the dictionary and invoke it
if let getFunc = urlDict["LOGIN"] {
    print(getFunc()) // http://IP_ADDRESS_COM/forgot_password
    Constants.sandbox = false
    print(getFunc()) // http://google.com
}

答案 1 :(得分:0)

您可以简单地为函数原型创建全局typealias,并且可以在项目的任何位置使用它,并且每次创建Dictionary时都不需要使用() -> String

public typealias VoidToStringFunctio‌n = () -> String

func getLoginURL() -> String {
return "url"

}

func getResetPasswordURL() -> String {
return "password"

}

并像这样使用

let urlDict : [String: VoidToStringFunctio‌n] = ["LOGIN": getLoginURL, "Password": getResetPasswordURL]