我一直在玩Swift并发现当向下投射一个要插入字典的对象时,我得到一个奇怪的警告:Treating a forced downcast to 'String' as optional will never produce 'nil'.如果我更换as,as?则警告消失.
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String
Run Code Online (Sandbox Code Playgroud)
Apple的文档说明如下
由于向下转换可能会失败,因此类型转换运算符有两种不同的形式.可选表单
as?将返回您尝试向下转换的类型的可选值.强制形式as尝试向下倾斜并强制将结果作为单个复合动作展开.
我不清楚为什么在这里使用as?而不是as正确的.一些测试显示,如果我更改test()以返回Int而不是String,如果我继续使用,代码将退出并出现错误as.如果我切换到使用as?那么代码将继续正常执行并跳过该语句(dict将保持为空).但是,我不确定为什么这是更可取的.在我看来,我宁愿程序退出并出现错误并让我知道演员表不成功然后只是忽略错误的声明并继续执行.
根据文档,我应该使用强制形式"只有当你确定转发将永远成功时".在这种情况下,我确信向下转换将永远成功,因为我知道test()只能返回一个字符串,所以我认为这是强制形式的向下转换的完美情况.那么为什么编译器会给我一个警告呢?
我Person在Swift中有一个简单的类,看起来像这样:
class Person {
var name = "John Doe"
var age = 18
var children = [Person]?
\\ init function goes here, but does not initialize children array
}
Run Code Online (Sandbox Code Playgroud)
children我可以简单地声明它并将其初始化为一个空数组,而不是声明为可选数组:
var children = [Person]()
Run Code Online (Sandbox Code Playgroud)
我想确定哪种方法更好.将数组声明为可选数组意味着它根本不会占用任何内存,而空数组至少为它分配了一些内存,对吗?因此,使用可选数组意味着至少会节省一些内存.我想我的第一个问题是:这里是否真的存在实际的内存节省,或者我对这个错误的假设是什么?
另一方面,如果它是可选的,那么每次我尝试使用它时,我都必须nil在添加或删除对象之前检查它是否存在.因此那里会有一些效率损失(但我想象的并不多).
我有点像可选的方法.并不是每一个Person都会有孩子,所以为什么不让children是nil,直到Person决定安顿下来,养家?
无论如何,我想知道一种方法或另一种方法是否存在任何其他特定的优点或缺点.这是一个反复出现的设计问题.
作为一种原始的版本Optional*,爪哇1.8提供OptionalInt,OptionalLong和OptionalDouble.
但我找不到同等的OptionalBoolean班级.
是否有任何技术原因反对OptionalBoolean?
*
一个Optional可以或可以不具有一个值的情况下,使用作为替代null.
这是我到目前为止所得到的:
Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));
Run Code Online (Sandbox Code Playgroud)
这让我觉得既丑陋又浪费.如果firstChoice存在,我不必要地计算secondChoice.
还有一个更高效的版本:
Optional<Foo> firstChoice = firstChoice();
if(firstChoice.isPresent()) {
return firstChoice;
} else {
return secondChoice();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我无法将一些映射函数链接到最终,而无需复制映射器或声明另一个局部变量.所有这些使得代码比实际解决的问题更复杂.
我宁愿写这个:
return firstChoice().alternatively(secondChoice());
Run Code Online (Sandbox Code Playgroud)
但是Optional ::或者显然不存在.怎么办?
这里有两个类似的问题,但是没有一个答案似乎有效.
PHPDoc似乎没有将我的函数中的可选参数识别为可选参数,例如:
/**
* Opens the connection and sets encoding
*
* @param string $encoding Encoding.
*/
public function __construct($encoding='UTF-8')
{
$this->connect_mysqli();
$this->set_encoding_mysqli($encoding);
}
Run Code Online (Sandbox Code Playgroud)
它不应该认为$ encoding是可选的,或者我在这里遗漏了什么?我真的试着谷歌并阅读文档,但我找到的只是:
如果你没有在实际代码中指出参数是可选的(通过"$ paramname ='默认值'"),那么你应该在参数的描述中提到参数是可选的.
所以我看到我的代码没有问题,但我在文档中得到的是:"__ construct(string $ encoding)",在参数是可选的任何地方都没有任何符号.
我试图在if let一行中编写以下代码块:
if let amount = datasource?.incrementForCount?(count) {
count += amount
}
else if let amount = datasource?.fixedIncrement {
count += amount
}
Run Code Online (Sandbox Code Playgroud)
当我尝试类似的东西:
if let amount = datasource?.incrementForCount?(count) || let amount = datasource?.fixedIncrement {
count += amount
}
Run Code Online (Sandbox Code Playgroud)
我有一个编译时错误.
where对于这种情况,我不认为该条款是可行的.
是否可以将两个if let陈述合并为ORed一个?
大多数网站都说"callee"作为Function.arguments的属性已被弃用.但有些网站更进一步,并说整个Functions.argument已被弃用,例如http://aptana.com/reference/api/Arguments.html为什么只提到被叫者,如果整个程序在水中已经死了?我只是发现了"论点",看起来非常有用,例如:http://hungred.com/how-to/secret-arguments-array-javascript/
在javascript中,babel插件支持Optional Chaining Operator .
但我无法在Typescript中找到如何做到这一点.任何的想法?
为什么Optional有类似的方法of()而ofNullable()不是公共构造函数?
@RequestMapping(value = "/contact.html", method = RequestMethod.POST)
public final ModelAndView contact(
@RequestParam(value = "name", required = false) Optional<String> name) {
Run Code Online (Sandbox Code Playgroud)
如果不需要参数值且没有发送任何内容,Spring如何@RequestMapping处理Optional来自Guava库的内容?
那将会:
nullOptional.absent()可以Optional.fromNullable(T)用来接受请求吗?
optional ×10
java ×3
java-8 ×3
swift ×3
javascript ×2
arguments ×1
arrays ×1
boolean ×1
chaining ×1
constructor ×1
downcast ×1
guava ×1
monads ×1
nullable ×1
param ×1
php ×1
phpdoc ×1
spring ×1
spring-mvc ×1
typescript ×1