override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
cell.label.text = todoData?[indexPath.row] as? String
return cell
}
我想我可以用更惯用的方式使用模式匹配来写这个
答案 0 :(得分:6)
def arrange(str1: String, str2: String) = str1 match {
case "YELLOW" => str1 -> str2
case _ => str2 -> str1
}
答案 1 :(得分:1)
有几种方法可以改进您的代码。
首先,if
是表达式,而不是语句。 (Scala中的几乎所有内容都是表达式。)因此,您只需return
if
表达式的结果而不是return
各个分支表达式:
def arrange(str1: String, str2: String): (String, String) = {
return if (str1 == "YELLOW") {
(str1, str2)
} else {
(str2, str1)
}
}
其次,在块,函数或方法中计算的最后一个表达式的值是整个块,函数或方法的值,因此我们可以完全删除return
:
def arrange(str1: String, str2: String): (String, String) = {
if (str1 == "YELLOW") {
(str1, str2)
} else {
(str2, str1)
}
}
接下来,如果一个块只包含一个单独的表达式,那么您就不需要该块,因此您可以删除括号。这适用于if
分支:
def arrange(str1: String, str2: String): (String, String) = {
if (str1 == "YELLOW") (str1, str2) else (str2, str1)
}
和方法体:
def arrange(str1: String, str2: String): (String, String) =
if (str1 == "YELLOW") (str1, str2) else (str2, str1)
最后,Scala有返回类型推断;通常,您不需要明确声明方法的返回类型。你可以说明它,但它通常只适用于不明显的情况。
def arrange(str1: String, str2: String) =
if (str1 == "YELLOW") (str1, str2) else (str2, str1)
所以,这看起来已经比原始版本好很多了,即使是纯粹的语法更改,也没有像切换到模式匹配那样进行任何语义更改。
答案 2 :(得分:0)
如果你真的想使用模式匹配:
<script type="text/javascript">
// Run function after page loaded
document.addEventListener('DOMContentLoaded', function() {
show_map_theo_address("some where, America");
}, false);
// This is the minimum zoom level that we'll allow
function show_map_theo_address(address) {
var geocoder, vitri;
var minZoomLevel = 15;
geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({
'address': address
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
vitri = results[0].geometry.location;
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: minZoomLevel,
center: new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng()),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
}
}
}
});
}
}
但是对于像这样的简单条件,def arrange(str1: String, str2: String) = str1 match {
case "YELLOW" => (str1, str2)
case _ => (str2, str1)
}
就是我们真正需要的。要在问题“惯用”中进行表达,只需删除if
,因为在Scala中,return
是表达式而不是流控制语句:
if
principle of least power是很好的指导:
http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html