我有方法:
func getByEmail(email:String) -> MeeterAccount{
for acct in accountsList {
if acct.getEmail().equalsIgnoreCase(email) {
return acct;
}
}
return nil; // here I get an error: type 'MeeterAccount' does not conform to protocol NilliteralConvertible
}
如何摆脱这个错误?
我想写下这样的东西:
func getByEmail(email:String) -> MeeterAccount{
var out:MeeterAccount!
for acct in accountsList {
if acct.getEmail().equalsIgnoreCase(email) {
out = acct
}
}
return out;
}
这不会引发此错误。听起来像Swift让我只写第二种方式。
为什么我无法退回nil
?
答案 0 :(得分:34)
如果您的函数可以返回nil
,则应将其声明为... -> MeeterAccount?
(可选类型)。然后调用者知道它可以是零。 (你的第二个例子有效但会崩溃,因为return out
将隐式尝试解包nil。)
答案 1 :(得分:10)
文字可转换协议
分配变量时,例如
var a = 9.0
9.0是变量a中赋值的文字。根据定义,literal是表示固定值的 符号
我的眼睛看到的是(九点零点)我的头脑将其解释为浮点值9.0。编译器也是如此。编译器看到(九点零)文字,然后它知道如何从该文字中分配正确的值。
Swift提供了一种方法来链接如何通过编译器从文字构造值。它们是字面上的可转换协议。
说我有一个功能
func returnString() -> String{
return nil
}
错误:类型'String'不符合协议 'NilLiteralConvertible'
如果我尝试返回3
错误:类型'String'不符合协议 'IntegerLiteralConvertible'
类型String
符合协议StringLiteralConvertible
,只有在您返回字符串文字时才会匹配(例如""
)
func returnString() -> String?{
return nil
}
这应该有用。
因为这里的返回类型不是String
而是Optional
,它是由Swift引入的。 Optional
实施协议NilLiteralConvertible
。在那里,您可以返回nil
。
希望我能以一种简单的方式解释看到的背后。
答案 2 :(得分:6)
您可以在功能签名中将返回类型标记为可选(请注意MeeterAccount
末尾的'?')
func getByEmail(email:String) -> MeeterAccount? {