2016-08-17 57 views
2

我希望創造一個字典,將有如何創建具有字符串和功能的鍵值對的字典迅速

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 
     } 

    } 

本字典的目的是爲了得到一個基於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} 


} 

回答

1

必須指定的功能(這是常見的兩種getLoginURL類型和getResetPasswordURL)爲字典中的value插槽,即() -> String,返回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 
} 
+0

謝謝你的答覆。 該代碼工作的操場,但在項目中,它給我'不能將類型'(常量) - >() - >字符串'的值轉換爲期望的字典值類型'() - > String''錯誤。 'Constants'是類的名稱。請幫助 – onkar

+0

@onkar從您的評論看來,這些函數似乎是_instance_類的函數'Constants'。這意味着你需要以'anInstanceOfConstants.getLoginURL'('Constants()。getLoginURL')的形式提供給'urlDict',而不是以'Constants.getLoginURL'的形式。後者將工作,如果功能'靜態'。由於你的類的名字是「常量」,我猜測這些函數可能是靜態的。 – dfri

+0

請檢查編輯 – onkar

0

你可以簡單地創建一個全局typealias到函數原型,並可以在項目的任何地方使用它,你不需要在創建字典使用() -> 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] 
+0

我不會推薦這個解決方案,特別是因爲typealias'Function'是_very_ broad(並且沒有說與它關聯的實際類型),而事實上(在上面的例子中)是關聯的只有一個特定的(函數/閉包)類型。可能通過使用更多描述性的typealias名稱(例如'VoidToStringFunction')來適用,但這似乎是不必要的冗長,因爲類型簽名'() - > String'清楚地說明了這一點。 – dfri

+0

我同意@dfri函數不是很好的冗長,但我不同意這個,我們應該使用() - >字符串無處不在。 如果他有超過100個功能呢?使用typealias更具可讀性。 – Sahil

+0

即使_「他有100個函數」_,對這些函數的引用只會是上面的'urlDict'中的_instances_,而這些函數的_type_(我們將假定它是一個唯一的類型,正如我們用' typealias'作爲替代)仍然只需要在'urlDict'的類型註釋中提供。無論是「typealias」還是顯式類型註釋都更具可讀性,都值得商榷。 – dfri