我对Swift相对较新,我一直在围绕可选变量。这是我遇到的问题:
func escape(s: String) -> String
{
if s == nil
{
return ""
}
return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
}
编译器抱怨说:
Value of type 'String' can never be nil, comparison isn't allowed
这是参考if s == nil
行。如果我删除if语句行并且只有返回值行,我会收到错误:
Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'
我在文档中看到stringByAddingPercentEncodingWithAllowedCharacters返回一个String?参数。我不明白为什么这不是一个字符串?由于String不能为nil,我不能将nil传递给这个函数,那么它将如何返回nil?
答案 0 :(得分:2)
您将参数s
定义为非可选String
。
非可选类型永远不能为零,这就是编译器抱怨的原因
只需删除对nil
。
您将返回类型定义为非可选String
要么必须打开结果值以符合类型
func escape(s: String) -> String
{
return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
}
或将返回类型更改为可选
func escape(s: String) -> String?
{
return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
}
答案 1 :(得分:1)
发布后不一分钟,我更深入地阅读了文档。 stringByAddingPercentEncodingWithAllowedCharacters即使给定非零值,也可以返回nil值。来自https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/#//apple_ref/occ/instm/NSString/stringByAddingPercentEncodingWithAllowedCharacters
返回值返回编码的字符串,如果转换则返回nil 是不可能的。
讨论UTF-8编码用于确定正确的百分比 编码字符。整个URL字符串不能进行百分比编码。