- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Gloss对于我的 JSON 实例化。这是一个示例类:
public class MyObj: Decodable
{
let id_user : String
let contact_addr1 : String
let contact_addr2 : String?
let contact_city : String
let contact_state : String
let contact_zip : String
let points : Int
// Deserialization
required public init?(json: JSON)
{
guard let id_user : String = "somekey" <~~ json else {
assertionFailure("MyObj - invalid JSON. Missing key: wouldbenicetonotwritethisforeachmember")
return nil
}
guard let contact_addr1 : String = "somekey" <~~ json else {
assertionFailure("MyObj - invalid JSON. Missing key: wouldbenicetonotwritethisforeachmember")
return nil
}
guard let contact_city : String = "somekey" <~~ json else {
assertionFailure("MyObj - invalid JSON. Missing key: wouldbenicetonotwritethisforeachmember")
return nil
}
guard let contact_state : String = "somekey" <~~ json else {
assertionFailure("MyObj - invalid JSON. Missing key: wouldbenicetonotwritethisforeachmember")
return nil
}
guard let contact_zip : String = "somekey" <~~ json else {
assertionFailure("MyObj - invalid JSON. Missing key: wouldbenicetonotwritethisforeachmember")
return nil
}
guard let points : Int = "somekey" <~~ json else {
assertionFailure("MyObj - invalid JSON. Missing key: wouldbenicetonotwritethisforeachmember")
return nil
}
self.id_user = id_user
self.contact_addr1 = contact_addr1
self.contact_addr2 = "somekey" <~~ json
self.contact_city = contact_city
self.contact_state = contact_state
self.contact_zip = contact_zip
self.contact_points = points
}
}
我有很多模型类。他们之间有数百名成员。为每个人写一个多行保护语句真的让我的代码变得垃圾。有什么办法可以将守卫功能封装成更简洁的东西吗?也许是一个函数或类似的东西:
shortGuard("memberName", "jsonKey")
也许有一种方法可以防止字符串键数组?
最佳答案
有多种方法可以实现这一点。它们都归结为编写一个包装函数来将您的键映射到值。以下是我想到的几个简单示例,但正如我所说,有很多方法可以做到这一点,具体取决于您所追求的目标:
enum JSONError: Error {
case keyNotFound(String)
}
extension JSON {
func values<T>(for keys: [String]) throws -> [T] {
var values = [T]()
for key in keys {
guard let value: T = key <~~ self else {
throw JSONError.keyNotFound(key)
}
values.append(value)
}
return values
}
func values<T>(for keys: [String], closure: ((_ key: String, _ value: T) -> Void)) throws {
for key in keys {
guard let value: T = key <~~ self else {
throw JSONError.keyNotFound(key)
}
closure(key, value)
}
}
}
第一个在您可以使用任何键之前验证所有键,如果不存在则抛出。你会像这样使用它:
do {
let keys = ["foo", "bar"]
// The type of the values constant is important.
// In this example we're saying look for values of type Int.
let values: [Int] = try json.values(for: keys)
for (index, key) in keys.enumerated() {
print("value for \(key): \(values[index])")
}
} catch JSONError.keyNotFound(let key) {
assertionFailure("key not found \(key)")
}
第二个会将出现在您的键数组中的键、值对传回闭包,并将抛出它发现不存在的第一个。
do {
let keys = ["foo", "bar"]
// The type of the closure's value argument is important.
// In this example we're saying look for values of type String.
try json.values(for: keys) { (key, value: String) in
print("value for key \(key) is \(value)")
}
} catch JSONError.keyNotFound(let key) {
assertionFailure("key not found \(key)")
}
在您的类的 init?()
函数中使用第一个版本,我们有这样的东西:
public struct MyObj: Decodable {
public let id_user : String
public let contact_addr1 : String
public let contact_addr2 : String?
public let points : Int
public init?(json: S) {
do {
let stringKeys = ["id_user", "contact_addr1"]
let stringValues: [String] = try json.values(for: stringKeys)
id_user = stringValues[0]
contact_addr1 = stringValues[1]
// this isn't required, so just extract with no error if it fails
contact_addr2 = "contact_addr2" <~~ json
let intKeys = ["points"]
let intValues: [Int] = try json.values(for: intKeys)
points = intValues[0]
} catch JSONError.keyNotFound(let key) {
assertionFailure("key \(key) not found in JSON")
return nil
} catch {
return nil
}
}
}
关于swift - 有没有办法更简洁地使用 guard 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43578910/
我想知道是否可以在haskell中使用守卫内部的守卫。像这样: analyser modele instr | instr == NoCom = (modele, "No command" ,
我正在尝试在 Windows 7 上将 Guard 与适用于 Chrome 的 LiveReload 插件一起使用。它不起作用,我不知道如何解决这个问题。我使用 Bash 启动防护,然后在浏览器中激活
我有以下代码。我正在检查 3 个条件。您可以看到,对于第一个条件,我将 xml:get_tag_attr_s(...) 的输出存储在变量中,然后在 if block 中使用该变量。我的问题是,如果我尝
是否有类似于自动测试的 ctrl+c 强制运行所有规范的东西?我仍在努力微调我的 .Guardfile,但目前我可以在不重新启动 guard 的情况下强制运行所有规范吗? ctrl+c 退出守卫。 最
我刚刚在 Angular 大学完成了关于 Angular 2 和 Firebase 的 Angular 2 类(class)。 讲师 Vasco (@angular-university) 提出 Ro
我正在使用 guard-zeus我的应用程序中的 gem gem 的行为符合预期,但控制台的输出全部失真。 看起来像是添加了额外的制表符,所以这些行没有按应有的方式断开 有人知道如何解决这个问题吗?
有人可以解释 Xcode 中这些选项的作用吗? 启用涂鸦 启用防护边缘 启用Guard Malloc 它们是什么、它们做什么以及它们对调试/测试有多大用处? 谢谢。 最佳答案 来自documentat
我关注了 "How I Test" screencast at RailsCasts ,但是我遇到了 spork 的问题 $ guard Guard is now watching at '/User
以下代码被mix视为错误: case test do ... t when !is_list(t) -> false ... end 错误是“防护中的表达式无效,防
我知道可以像这样使用 guard 语句 guard let someConstant = someOptional() else { // ... } 我试着去做 struct MyStruc
我按照 Michael Hartl 的 Rails 教程使用 Spork 运行 Guard,我遇到了这个问题。以下是错误信息: 20:45:58 - INFO - Starting Spork for
尝试在我的 ubuntu 机器上安装 Guard,但是当我尝试从命令行运行它时出现此错误: No command 'guard' found, did you mean: Command 'guar
我是 Laravel 的新手。我正在浏览默认的身份验证中间件,我看到它正在使用: Auth::guard($guard)->guest() 检查用户是否是访客。 文档位于 https://larave
我正在通过 Ruby on Rails 教程(Michael Hartl)学习 RoR。 现在我尝试使用 Guard 运行测试。 我的 gem 文件: source 'https://rubygems
请帮我解决这个问题 我想使用多重身份验证。 我的 Laravel 版本是 5.2.* (5.2.29) 文档中写的我都做 //congig/auth.php [ 'guard' => 'we
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
一 点睛 当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再次访问,这就是 Guarded Suspension 设计模式。该设计模式的关注点在于临界值的条件是否满足,当达到设置的临界
我正在制作一个步骤向导,并试图阻止用户导航到即将到来的页面路由,除非他们导航到这些步骤,但允许他们导航到之前的页面/步骤。 我目前的解决方案是为每个页面/步骤指定一个步骤编号,但它不允许导航到前面的步
其他stackoverflow-ers, 我目前正在学习 Erlang。 有人可以指出我为什么会收到 illegal guard expression用这个守卫? add_new_prime(Idx,
我是一名优秀的程序员,十分优秀!