首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将隐式展开的可选赋值给显式可选

将隐式展开的可选赋值给显式可选
EN

Stack Overflow用户
提问于 2014-09-01 16:24:06
回答 3查看 1.1K关注 0票数 3

如果一个函数返回一个隐式取消包装的可选函数,你会将它赋给显式可选函数吗?

例如,在Chris Adamson的blog post中,他首先列出了一个返回隐式展开的函数,然后将该函数的返回值赋给显式可选。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class func JSONObjectWithData(_ data: NSData!,
                      options opt: NSJSONReadingOptions,
                        error error: NSErrorPointer) -> AnyObject!

let jsonResponse : AnyObject? =
NSJSONSerialization.JSONObjectWithData(evilData,
    options: NSJSONReadingOptions(0),
    error: &parseError);

如果函数要返回不能为nil的值,为什么要将其赋给可选的?

EN

回答 3

Stack Overflow用户

发布于 2014-09-01 16:40:42

在这种特殊情况下,AnyObject!的返回是SDK中的一个错误(从技术上讲,它只是一个地方,他们已经使用了自动Swiftifier,还没有手动修复它)。JSONObjectWithData绝对可以返回nil。从文档中:

基础返回值: data中

数据的基础对象,如果出现错误,返回值为空。

Chris将这个值从可能的崩溃中拯救出来,方法是将它移动到显式可选项,而不是实际上可能为ni的隐式值。

票数 3
EN

Stack Overflow用户

发布于 2014-09-01 16:47:58

只要您可以将Implicit Unwrapped Optional更改为由api返回的Optional Type,您就应该始终使用此方法,因为xcode将来的版本将尝试将其Implicit Optionals type替换为explicit optional,并且在beta 6和5中,此方法已开始使用,并且许多api已更改为使用explicit optional type.The专家建议尽可能避免Implicit Unwrapped Optional,因为每当使用automatically.While类型对Implicit Unwrapped Optional进行解包装时,您都会遇到崩溃。您必须显式地解开该值,因此您可以通过放置if条件或如果你真的确信它不会是空的,因为你可以在没有if的情况下解开它(但你应该总是检查nil大小写)。

JSONObjectWithData可以返回nil,因为你不知道evilData中有什么,如果它不能在json中转换,你会得到nil值,如果你试图在代码中的其他地方使用jsonResponseimplicit optional type,而不是你的应用程序将在运行时崩溃。这就是为什么克里斯使用explicit optional来注意这种情况,否则在使用jsonResponse不会自动解包到nil的情况下,这可能会导致crashes.If,你可以自己用<代码>D20或<代码>D21解包代码,你可以避免崩溃并显示一些有意义的完整消息。

票数 0
EN

Stack Overflow用户

发布于 2014-09-01 16:49:39

隐式展开的可选选项仍然是可选的,尽管它被保证保持一个值。

将隐式展开的可选赋值给正常的可选是合法的。

因此,如果您的应用程序中有一个线性逻辑,其中您声明了一个可选变量,然后使用隐式展开的可选对其进行初始化,则最好使用非可选的。

但在某些情况下,您定义了一个可选变量(假设在函数的开头),然后根据条件、流、if等,可以从不同的函数中为其赋值-如果其中至少有一个函数可以返回普通的可选变量,那么您必须将该变量声明为可选变量。

但在这种情况下,即使用于为可选/非可选变量赋值的所有函数总是返回非可选或(至少其中一个)隐式展开的可选,最好还是使用可选声明,因为将来可能会有一个新的代码分支返回正常的可选。

最后,非常有趣的是,这似乎工作得很好,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x: Int! = nil

尽管我不得不承认,我希望它抛出一个运行时异常。知道了这一点,我想从现在开始,当一个函数声明返回一个隐式展开的函数时,我将总是使用一个可选的。

更多测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func test() -> Int! {
    return nil
}

let q1: Int? = test() // it works, q1 = nil (expected)
let q2: Int! = test() // it works, q2 = nil (unexpected)
let q3: Int = test() // runtime exception (expected)

更新:这是documentation所说的:

如果在未包含值的情况下尝试访问隐式展开的可选对象,则会触发运行时错误。结果与在不包含值的normal optional后面放置感叹号完全相同。

这意味着:赋值nil是可以的,但只要它被访问(即赋值给另一个变量,在表达式中使用,等等)它将触发错误

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25609822

复制
相关文章
go: 当我们在使用sync.Map时,发生了什么
sync.Map是我比较喜欢的一个库,用了非常久,今天突发奇想瞧瞧它的实现。又一次被宇宙中第二NB的语言--go 折服了。 这里准备写一篇文章,讨论下当使用sync.Map执行操作的时候,会发生什么。
超级大猪
2020/07/06
9710
当我们和业务在讨论“预测”时,到底在讨论什么?
所谓“预测”,统计学上是有精确定义的:是对事物的发展趋势和在未来时期的数量表现做出推测和估计的理论和技术——它是一个概率结论。可是当你在百度上搜索“预测”这个关键字时,会出现好几页的结果都是五行、八卦、星座、塔罗牌。这可能就是真实的预测和多数人眼中的“预测”之间的差异:一个算数,一个算卦。
张俊红
2020/11/19
4300
当我们和业务在讨论“预测”时,到底在讨论什么?
当我们在讨论APS时,我们在讨论什么?
高级计划与排程(Advanced Planning and Scheduling,简称“ APS” ),是解决生产排程和生产调度问题,常被称为排序问题或资源分配问题。它是利用许多先进的规划管理技术,包括限制理论(Theory Constraints, TOC)、运筹学(Operations Research, OR)、遗传算法(Genetic Algorithms, GA)、限制条件满足技术(Constraint Satisfaction Technique, CST)等,在有限资源下,寻求供给与需求之间的平衡规划;同时,利用信息的储存与分析能力,以最短的期限,达到最有效的规划。
李英杰同学
2020/02/11
6990
当我们在讨论APS时,我们在讨论什么?
为什么在重写equals方法时都要重写equals方法
为什么在重写equals方法时都要重写equals方法呢: 首先equals与hashcode间的关系是这样的:
知识浅谈
2021/09/27
6990
为什么在重写equals方法时都要重写hashcoe方法
object的equals默认是比较内存地址,hashcode默认是内存地址的哈希值,如果equals重写了,他为true时两个对象并不一定内存地址一样,这个时候,如果不重写hashcode,那么他会默认用object的hashcode方法,所以他们的hashcode值是不一样的。就导致两个对象equals相等但是hashcode不相等,这个对象应用在hashmap作为key时他们是先判断hashcode是否相等再比较equals,不相等就为不同的key,所以这样的对象不能应用在hashmap和set里作为key。
知识浅谈
2022/05/12
5490
当我们在分析异常数据时,我们在分析什么
数据异常分析,是数据分析工作中最常见且重要的分析主题,通过一次次的异常分析来明确造成数据波动的原因,建立日常的的运营工作和数据波动之间的相关性以及贡献程度的概念,从而找到促进数据增长的途径,改变数据结果。
小莹莹
2018/07/24
2.4K0
当我们在分析异常数据时,我们在分析什么
当我们讨论数据挖掘时,我们在讨论什么?
? ? ? ? ? ? ? ? ? ? ?
钱塘数据
2018/03/06
7900
当我们讨论数据挖掘时,我们在讨论什么?
java中println和printf有什么区别_string和int的区别
输出结果为: 12 即打印了int型变量i的值之后不换行继续打印int型变量j的值。
全栈程序员站长
2022/11/10
6690
java中string转换为int(int char)
// String change int public static void main(String[] args) { String str = “123”; int n; // first method // n = Integer.parseInt(str); n = 0; n = Integer.parseInt(str); System.out.println(“Integer.parseInt(str):”+ n); System.out.println(“\n”); //second method //n = Integer.valueOf(str).intValue();
全栈程序员站长
2022/07/28
1.9K0
java中string转换为int(int char)
当我们聊元宇宙时,我们在聊些什么?
  细数一下游戏画面的发展历程,从最初的仅由点与线构成的字符画文字冒险游戏,到现在用上实时光线追踪的《战地5》,游戏的画面愈发真实,甚至可以做到以假乱真,与照片无异。但是最核心的一点,游戏的操作与互动
科技旋涡
2022/03/30
2560
当我们聊元宇宙时,我们在聊些什么?
为什么重写 equals 时必须重写 hashcode?
equals 默认是和==一样,判断引用是否相等的,一般需要覆写后才能实现真正的判等。
水货程序员
2018/11/13
2.4K0
String中new String(byte[] b, int n, int m)的理解
String item = new String(b, n, m)的用法,其中b为byte[]数组,n,m为int类型. 简单的来说就是byte数组b从下标为n开始前进m个下标的那一段数组变为字符串item。概念比较难理解,下面直接看例子吧! 例如1:              b={'1' ,'2', '3', '4', '5', '6', '7', '8'};           String item=new String(b,2,2)           结果 item=34 例如2:            String item=new String(b,0,3)           结果 item=123 看例子可以很清楚的看到new String(byte[] b, int n, int m)中个参数的作用。这种情况一般出现在要对byte进行处理的情况。 例如Android中加密和解密的过程就会用到这种情况。
林老师带你学编程
2022/11/30
5240
Python基础-int和string互
int转成string,函数int(string) string转成int,函数str(number) 如下:
py3study
2020/01/10
6380
学问Chat UI(2)
前言 上文讲了下要去做哪些事,重点分析了融云Sdk中RongExtension这个扩展控件,本文来学习下同样是融云Sdk中的AutoRefreshListView如何适配多种消息的实现方式,写的有不足之处还望指出。 AutoRefreshListView如何适配多种消息 本文不分析AutoRefreshListView内部源码,从数据适配角度分析如何适配上文讲到的多种聊天消息; 既然从AutoRefreshListView开始,那先来了解下一般使用ListView的步骤: 布局器寻找ListView控件,
用户1148881
2018/01/17
8960
学问Chat UI(2)
scala String to Int
object StringUtils { /** * 判断字符串是否是纯数字组成的串,如果是,就返回对应的数值,否则返回0 * @param str * @return */ def strToInt(str: String): Int = { val regex = """([0-9]+)""".r val res = str match{ case regex(num) => num case _ => "0"
大数据工程师-公子
2019/03/14
1.6K0
2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?
我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:
Albert陈凯
2018/12/17
7870
2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
因为,比较 String 字符串的值是否相等,可以使用 equals() 方法。String 中的 equals 方法是被重写过的。Object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是字符串的值是否相等。
Guide哥
2021/09/16
3390
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
因为,比较 String 字符串的值是否相等,可以使用 equals() 方法。String 中的 equals 方法是被重写过的。Object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是字符串的值是否相等。
Java技术江湖
2021/09/10
5960
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
当我们谈注册中心时谈什么?
注册中心对于服务提供者需要具备服务注册、注销的能力,对于服务消费者需要提供查询服务、感知服务变化的功能。当然还需要解决一些其他问题才能成为一个优秀的注册中心,如高可用、高性能、水平扩展能力、服务探活能力、路由功能、多机房(多活)能力等。
龟仙老人
2020/12/16
6020
【面试题精讲】String 类型的变量和常量做“+”运算时发生了什么?
在 Java 中,String 类型的变量和常量可以通过"+"运算符进行拼接操作。这意味着当我们使用"+"将两个 String 类型的值连接起来时,会生成一个新的 String 对象。
程序员朱永胜
2023/10/14
3350

相似问题

滚动列表时Android SimpleCursorAdapter newView bindView错误

10

Android: newView和bindView在自定义SimpleCursorAdapter中的问题

21

newView和bindView不被调用

11

bindView()和newView()在CursorAdapter中的作用

11

CursorAdapter bindView和newView不开火

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文