我正在尝试使用这些代码行
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
Run Code Online (Sandbox Code Playgroud)
上面的代码产生如下
Daniel hides his age.
Daniel is Optional(18) years old.
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么有可选(18)那里,我怎么能删除可选和只是打印
Daniel is 18 years old.
Run Code Online (Sandbox Code Playgroud)
Apf*_*aft 184
你必须了解一个可选的是什么.许多Swift初学者认为var age: Int?年龄是一个可能有或没有价值的Int.但这意味着年龄是一个可选的,可能会或可能不会持有Int.
在description()函数内部,您不打印Int,而是打印Optional.如果要打印Int,则必须打开Optional.您可以使用"可选绑定"来解包可选:
if let a = age {
// a is an Int
}
Run Code Online (Sandbox Code Playgroud)
如果您确定Optional包含一个对象,则可以使用"强制解包":
let a = age!
Run Code Online (Sandbox Code Playgroud)
或者在您的示例中,由于您已在description函数中对nil进行了测试,因此您只需将其更改为:
func description() -> String {
return age != nil ? "\(name) is \(age!) years old." : "\(name) hides his age."
}
Run Code Online (Sandbox Code Playgroud)
GJZ*_*GJZ 19
可选的意思是Swift不完全确定该值是否与类型相对应:例如,Int?意味着Swift并不完全确定该数字是否为Int.
要删除它,您可以使用三种方法.
1)如果您完全确定类型,可以使用感叹号强行打开它,如下所示:
// Here is an optional variable:
var age: Int?
// Here is how you would force unwrap it:
var unwrappedAge = age!
Run Code Online (Sandbox Code Playgroud)
如果您强行打开一个可选项并且它等于nil,则可能会遇到此崩溃错误:
这不一定是安全的,所以这里有一个方法可以防止崩溃,以防你不确定类型和值:
方法2和3防止这个问题.
2)隐式解包可选
if let unwrappedAge = age {
// continue in here
}
Run Code Online (Sandbox Code Playgroud)
请注意,unwrapped类型现在是Int,而不是Int?.
3)警卫声明
guard let unwrappedAge = age else {
// continue in here
}
Run Code Online (Sandbox Code Playgroud)
从这里开始,您可以继续使用未包装的变量.如果您确定变量的类型,请确保仅强制打开(使用!).
祝你的项目好运!
更新
简单地使用me.age ?? "Unknown age!".它适用于3.0.2.
老答案
没有强行打开(没有马赫信号/崩溃,如果为零)另一种不错的方法是:
(result["ip"] ?? "unavailable").description.
result["ip"] ?? "unavailable" 应该也有工作,但事实并非如此,至少在2.2中没有
当然,用适合你的东西替换"不可用":"nil","not found"等
出于测试/调试目的,我经常希望将选项输出为字符串,而不必总是测试nil值,因此我创建了一个自定义运算符.
我看完之后进一步改善的东西在另一个问题这个答案.
fileprivate protocol _Optional {
func unwrappedString() -> String
}
extension Optional: _Optional {
fileprivate func unwrappedString() -> String {
switch self {
case .some(let wrapped as _Optional): return wrapped.unwrappedString()
case .some(let wrapped): return String(describing: wrapped)
case .none: return String(describing: self)
}
}
}
postfix operator ~? { }
public postfix func ~? <X> (x: X?) -> String {
return x.unwrappedString
}
Run Code Online (Sandbox Code Playgroud)
显然,操作符(及其属性)可以根据自己的喜好进行调整,或者您可以将其设置为函数.无论如何,这使您能够编写如下的简单代码:
var d: Double? = 12.34
print(d) // Optional(12.34)
print(d~?) // 12.34
d = nil
print(d~?) // nil
Run Code Online (Sandbox Code Playgroud)
集成其他人的协议想法使它甚至适用于嵌套选项,这通常在使用可选链接时发生.例如:
let i: Int??? = 5
print(i) // Optional(Optional(Optional(5)))
print("i: \(i~?)") // i: 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78610 次 |
| 最近记录: |