Swift 4(Alamofire)中如何替换ServerApi类API URL的%s参数
如何在Swift的ServerApi类中动态替换URL占位符%s
嗨,针对你遇到的这个问题,其实只需要对ServerApi类做一点小调整,就能优雅地实现动态替换%s占位符的需求,同时保持URL集中管理的优势。
方案一:在ServerApi中封装生成带参数URL的静态方法
这种方式最推荐,因为它把URL的生成逻辑完全封装在ServerApi类内部,外部调用只需要传参数就行,不用关心内部的占位符细节,后续维护也更省心。
修改你的ServerApi类:
class ServerApi { private static let BASE_URL = "http://myurl" private static let URL_PATH = "http://myurl2" // 无参数的URL依然用静态变量 static var API_LOGIN = BASE_URL + "/auth/local" static var API_SIGNUP = BASE_URL + "/auth/local/register" static var API_PLACE = BASE_URL + "/place" static var URL_ORDER = URL_PATH + "/orders" static var URL_CREATE_PAYMENT = URL_PATH + "/payments" // 带参数的URL先定义为私有模板常量(仅类内部使用) private static let API_ONE_PLACE_TEMPLATE = BASE_URL + "/place/%s" private static let API_IMAGE_TEMPLATE = BASE_URL + "/%s" private static let URL_RELOAD_WALLET_TEMPLATE = URL_PATH + "/wallet/%s/reload" private static let URL_PAYMENT_TEMPLATE = URL_PATH + "/wallet/%s/payment" private static let URL_WALLET_ACCOUNT_TEMPLATE = URL_PATH + "/wallet/%s" private static let URL_USER_TRANSACTION_TEMPLATE = URL_PATH + "/wallet/%s/transactions" private static let URL_CABINET_TEMPLATE = URL_PATH + "/cabinets/%s" private static let URL_PAYMENT_IMAGE_TEMPLATE = URL_PATH + "/payments/%s" // 注意你原代码里有重复的URL_IMAGE,这里重命名避免冲突 // 提供静态方法生成最终URL static func getOnePlaceURL(userId: String) -> String { return String(format: API_ONE_PLACE_TEMPLATE, userId) } static func getWalletAccountURL(userId: String) -> String { return String(format: URL_WALLET_ACCOUNT_TEMPLATE, userId) } // 其他带参数的URL同理,添加对应的方法即可 static func getUserTransactionURL(userId: String) -> String { return String(format: URL_USER_TRANSACTION_TEMPLATE, userId) } }
然后调用的时候就可以这样用:
let user_id = "123456" func viewBalance() { let walletURL = ServerApi.getWalletAccountURL(userId: user_id) Alamofire.request(walletURL).responseJSON { response in print(response) if let balanceJSON = response.result.value { let dataObject = balanceJSON as! [String: Any] print(dataObject) let balanceObject = dataObject["data"] as! [String: Any] let balance = balanceObject["account_balance_display"] as! String let newBalance = balance.dropFirst(2) self.balanceLabel.text = "\(newBalance)" } } }
方案二:直接在调用时用String(format: )格式化静态变量
如果不想修改太多ServerApi的原有结构,也可以直接在调用时用字符串格式化替换占位符,比如:
let user_id = "123456" let walletURL = String(format: ServerApi.URL_WALLET_ACCOUNT, user_id) // 把生成好的walletURL传给Alamofire.request即可
不过这种方式的缺点是,外部代码需要知道ServerApi里的URL用了%s作为占位符,耦合度比方案一高,所以还是更推荐方案一,把所有URL相关逻辑都封装在ServerApi类里。
另外要注意:你原代码里有两个重名的URL_IMAGE静态变量,这会导致编译错误,记得要重命名其中一个哦!
内容的提问来源于stack exchange,提问作者madhatter989
相关产品推荐
相关产品推荐

