如果您有数据类型
data Something = foo Integer
| bar Bool
Run Code Online (Sandbox Code Playgroud)
无论如何我有定义"getters"打开Something类型以获得Integer或Bool?现在它就像(foo Integer)和(bar Bool).我只想要Integer或Boolean值.
我的观点是在某些地方我们知道变量根本不会有 nil 但由于某种原因我们不能在类的 init 函数中实例化它所以我们必须使它成为可选的。
我也知道我们可以使用可选的绑定或保护技术来轻松摆脱它。
但是在我看来,让应用程序因为隐式解包/强制解包而在一些非常愚蠢的错误中崩溃对于开发阶段的开发人员来说是有益的。
我的例子是:
class TopStoriesViewModelTests: XCTestCase {
var viewModel: TopStoriesViewModel!
override func setUp() {
super.setUp()
viewModel = TopStoriesViewModel(interactor: MockTopStoriesInteractor())
}
func testArticleDidVisited() {
viewModel.visited = xxxxxx
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以制作TopStoriesViewModel一个?then 保护它,或者在每个测试用例中都使用它,但我觉得没有必要。我知道我也可以使用viewModel?.xxx。但这不是重点。
我的问题是,在某些情况下,例如我给出的示例,强制解包/隐式解包是有益的,我是否正确。
由于使用unwrap可能会出现问题,因为它在错误场景中崩溃,因此可能被认为是危险的使用。
如果我百分百确定它不会崩溃怎么办,就像在以下场景中一样:
if option.is_some() {
let value = option.unwrap();
}
Run Code Online (Sandbox Code Playgroud)
if option.is_some() {
let value = option.unwrap();
}
Run Code Online (Sandbox Code Playgroud)
由于我们已经检查过,Result因此Option使用时不会发生崩溃unwrap()。但是,我们可以使用matchor if let。在我看来,要么match要么if let用法更优雅。
我不明白,如果选项为 None,为什么要评估 Option.and() 。文档说....
如果选项为 None,则返回 None,否则返回 optb(and() 的参数)。
所以我希望,如果选项不是“无”,则仅(且仅在那时)考虑 and() 。但显然事实并非如此。让我们看看下面的代码......
let n: Option<i32> = None;
let m = n.and(Some(n.unwrap()));
Run Code Online (Sandbox Code Playgroud)
我知道这是一个愚蠢的示例,但这只是为了让我的观点更清楚。
在 swift 我使用这个代码:
var categories: Results<Category>? //Realm dataType
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let categories = categories, !categories.isEmpty {
return categories.count
} else {
return 1
}
}
Run Code Online (Sandbox Code Playgroud)
我现在希望将 tableView 的代码构建为三元运算符,但不知道如何执行此操作。我找到了以下页面:https : //dev.to/danielinoa_/ternary-unwrapping-in-swift-903但我仍然不清楚。
我试过的是:
return categories?.isEmpty ?? {($0).count} | 1
Run Code Online (Sandbox Code Playgroud)
或者
let result = categories?.isEmpty ?? {($0).count} | 1
return result
Run Code Online (Sandbox Code Playgroud)
但两者都给出错误。知道我该如何解决这个问题吗?
哈斯克尔再次来到这里.如果我想打开一个Maybe类型并希望保持抽象,我会使用:
fUnwrap :: Maybe a -> a
fUnwrap (Just n) = n
fUnwrap Nothing = ???
Run Code Online (Sandbox Code Playgroud)
无论我做什么Nothing,编译器一直在唠叨如何更具体地说明Nothing......你们可以帮助我吗?