我有方法:
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
}
Run Code Online (Sandbox Code Playgroud)
如何摆脱这个错误?
我想写下这样的东西:
func getByEmail(email:String) -> MeeterAccount{
var out:MeeterAccount!
for acct in accountsList {
if acct.getEmail().equalsIgnoreCase(email) {
out = acct
}
}
return out;
}
Run Code Online (Sandbox Code Playgroud)
这不会引发此错误.听起来像Swift让我只写第二种方式.
为什么我不能回来nil?
jtb*_*des 34
如果您的函数可以返回nil,则应将其声明为... -> MeeterAccount?(可选类型).然后调用者知道它可以是零.(你的第二个例子可以工作,但会崩溃因为return out会隐式尝试解开nil.)
Mad*_*Nik 10
文字可转换协议
例如,分配变量时
var a = 9.0
Run Code Online (Sandbox Code Playgroud)
9.0是变量a中赋值的文字.根据定义,literal是表示固定值的符号
我的眼睛看到了什么(九点零)我的头脑将其解释为浮点值9.0.编译器也是如此.编译器看到(九点零)文字,然后它知道如何从该文字中分配正确的值.
Swift提供了一种方法来链接如何通过编译器从文字构造值.它们是字面上的可转换协议.
说我有功能
func returnString() -> String{
return nil
}
Run Code Online (Sandbox Code Playgroud)
错误:类型'String'不符合协议'NilLiteralConvertible'
如果我试着返回3
错误:类型'String'不符合协议'IntegerLiteralConvertible'
该类型String符合协议StringLiteralConvertible,仅当您返回字符串文字时才进行匹配(例如"")
func returnString() -> String?{
return nil
}
Run Code Online (Sandbox Code Playgroud)
这应该工作.
因为这里的返回类型不是String,但Optional它是由斯威夫特介绍.Optional实现协议NilLiteralConvertible.在那里你被允许返回nil.
希望我能以一种简单的方式解释看到的背后.
您可以在函数签名中将返回类型标记为可选(请注意末尾的"?" MeeterAccount)
func getByEmail(email:String) -> MeeterAccount? {
Run Code Online (Sandbox Code Playgroud)