为什么要有forced unwrapping?

heartRaining 2014-07-23 12:42:49
RT

比如:
var hello: Int? = 404
println(hello)

既然直接用hello也能得到值404,那为什么非得要出现个hello!呢?它的实际用途是干嘛?

if hello {
println(hello!)//为什么这里就得用forced unwrapping,不用不也一样吗?
}
else{
println("nothing")
}
...全文
231 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bannings 2014-08-01
  • 打赏
  • 举报
回复
引用 5 楼 zhanglei5415 的回复:
[quote=引用 4 楼 zhangao0086 的回复:] [quote=引用 2 楼 zhanglei5415 的回复:] 强制约束,保证hello变量有值。如果hello为空,程序报错
我是觉得吧,这样虽然可以解释Swift的unwrapping,但是它的好处在哪呢?OC也没有forced unwrapping,但是也没有人抗议过吧?[/quote] swift 语言一个特点就是不会自动给变量赋初始值,但又要求在使用变量时一定要有值。也就是说在使用变量之前不进行初始化就会报错。 考虑下这一种情况,我们有一个自定义的MyViewController类,类中有一个属性是myLabel,myLabel是在viewDidLoad中进行初始化。因为是在viewDidLoad中初始化,所以不能直接声明为普通值:var myLabel : UILabel,因为非Optional的变量必须在声明时或者构造器中进行初始化,但我们是想在viewDidLoad中初始化,所以就只能声明为Optional:var myLabel: UILabel? 这是optional 可选值的作用,你说的强制解包有什么好处,这是语言自己实现的要求。上面已经有解释。[/quote] 其实我的意思很简单,强制解包没有什么好处
ReyZhang 2014-08-01
  • 打赏
  • 举报
回复
引用 4 楼 zhangao0086 的回复:
[quote=引用 2 楼 zhanglei5415 的回复:] 强制约束,保证hello变量有值。如果hello为空,程序报错
我是觉得吧,这样虽然可以解释Swift的unwrapping,但是它的好处在哪呢?OC也没有forced unwrapping,但是也没有人抗议过吧?[/quote] swift 语言一个特点就是不会自动给变量赋初始值,但又要求在使用变量时一定要有值。也就是说在使用变量之前不进行初始化就会报错。 考虑下这一种情况,我们有一个自定义的MyViewController类,类中有一个属性是myLabel,myLabel是在viewDidLoad中进行初始化。因为是在viewDidLoad中初始化,所以不能直接声明为普通值:var myLabel : UILabel,因为非Optional的变量必须在声明时或者构造器中进行初始化,但我们是想在viewDidLoad中初始化,所以就只能声明为Optional:var myLabel: UILabel? 这是optional 可选值的作用,你说的强制解包有什么好处,这是语言自己实现的要求。上面已经有解释。
ReyZhang 2014-07-31
  • 打赏
  • 举报
回复
swift 中的可选值 optional 其实是一个枚举值,看一下它的定义
enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)

    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}
可以看到,它有两个枚举值,一个None,一个Some. 当值为nil时其实就是 Optional.None. 非nil 时为Optional.Some,并被Some(T) 包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包的原因
ReyZhang 2014-07-31
  • 打赏
  • 举报
回复
强制约束,保证hello变量有值。如果hello为空,程序报错
Bannings 2014-07-31
  • 打赏
  • 举报
回复
引用 2 楼 zhanglei5415 的回复:
强制约束,保证hello变量有值。如果hello为空,程序报错
我是觉得吧,这样虽然可以解释Swift的unwrapping,但是它的好处在哪呢?OC也没有forced unwrapping,但是也没有人抗议过吧?
Bannings 2014-07-28
  • 打赏
  • 举报
回复
只能说,Swift目前不支持隐匿类型转换
Swift的版本兼容性非常重要,它允许开发者在使用新版本语言特性的同时,能够兼容并支持旧版本的Swift。例如,在Xcode 11.4中默认使用的是Swift 5.2版本,但开发者仍然可以利用该工具构建Swift 5.1、Swift 4.2或Swift 4版本的项目。不过,存在一些Swift 5.2或更高版本独享的特性,比如返回值是不透明类型的函数依赖于Swift 5.1运行时,try?表达式不会引入额外的可选类型层级,以及大数字的整型字面量初始化代码能够被正确推导为整型类型等。 Swift语言非常注重内存的安全性和管理。它自动管理内存,这大大简化了内存的使用,并且减少了诸如内存泄漏等问题的发生。Swift还引入了可选链(Optional Chaining)和强制解包(Forced Unwrapping)等概念,以帮助开发者安全地处理可选值(Optional)和nil值。 此外,Swift语言还强调了错误处理(Error Handling)机制,它允许程序从错误中恢复,并继续执行。错误处理使用了do-catch语句、try、catch、throw关键字和Error协议,以适应不同的错误处理策略。 Swift的核心特性包括: - 基础部分:包括基本运算符、字符串和字符、集合类型、控制流。 - 面向对象编程:涵盖了类和结构体、函数、闭包、枚举、属性、方法、下标、继承、构造过程、析构过程。 - 高级特性:涉及可选链、错误处理、类型转换、嵌套类型、扩展、协议、泛型、不透明类型、自动引用计数(ARC)、内存安全、访问控制。 - 语言参考:包括词法结构、类型表达式、语句、声明特性、模式、泛型参数、语法总结。 - Swift的使用和设计哲学:Swift的设计哲学旨在提供安全、快速和互动的编程体验,它结合了现代编程语言的优点和苹果工程师文化的智慧,以及来自开源社区的多样化贡献。

1,424

社区成员

发帖
与我相关
我的任务
社区描述
Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于MAC OS和iOS平台,用于搭建基于苹果平台的应用程序。
swift 技术论坛(原bbs)
社区管理员
  • Swift
  • 网罗开发
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧