当前位置: 首页 > 面试题库 >

“ as”,“ as!”和“ as”有什么区别?

江智
2023-03-14
问题内容

在升级到Swift 1.2之前,我可以编写以下行:

if let width = imageDetails["width"] as Int?

现在它迫使我写这一行:

if let width = imageDetails["width"] as! Int?

我的问题是,如果我被迫如上所述编写代码,难道我不能只编写下面的代码,它会做同样的事情吗?在imageDetails的所有值中都可以得到相同的结果吗?

if let width = imageDetails["width"] as Int

问题答案:

as关键字用于进行上下转换:

// Before Swift 1.2
var aView: UIView = someView()

var object = aView as NSObject // upcast

var specificView = aView as UITableView // downcast

从派生类到基类的转换可以在编译时检查,并且永远不会失败。

但是,向下转换可能会失败,因为您无法始终确定特定的类别。如果您有UIView,则可能是UITableView或UIButton。如果您的垂头丧气选择正确的类型,那就太好了!但是,如果碰巧指定了错误的类型,则会出现运行时错误,并且应用程序将崩溃。

在Swift 1.2中,向下转换必须是可选的as?或用as!“强制失败”。如果您确定类型,则可以用as强制转换!类似于您使用隐式展开的可选内容的方式:

// After Swift 1.2
var aView: UIView = someView()

var tableView = aView as! UITableView

感叹号清楚地表明您知道自己在做什么,并且如果您不小心混淆了各种类型,很可能事情会变得非常错误!

一如既往 使用可选绑定是最安全的方法:

// This isn't new to Swift 1.2, but is still the safest way
var aView: UIView = someView()

if let tableView = aView as? UITableView {
  // do something with tableView
}

从以下站点获得此消息:SOURCE



 类似资料:
  • 主要内容:语法,示例SQL AS 关键字用于为表或字段起一个临时的别名。别名是临时的,它仅在当前 SQL 语句中奏效,数据库中的实际表名和字段名不会更改。 SELECT 命令的结果集中将显示别名,而不是原始名。 通常在下列情况中使用别名: 有两个名字重复的表,需要为其中一个表起一个别名加以区分,比如 SELF JOIN。 两个表中有重复的字段名,起别名加以区分。 表名/字段名较长,或者可读性差。 语法 表别名的基本语

  • JBoss是一套开源的企业级 Java 中间件系统,用于实现基于 SOA 的企业应用和服务。目前 JBoss 已经被 RedHat 收购。 在各种 J2EE 应用服务器中,JBoss 是最受欢迎而且功能最为强大的应用服务器。 主要的特点包括: 1. 具有革命性的JMX微内核服务作为其总线结构; 2. 面向服务的架构(Service-Oriented Architecture,SOA); 3. 统一

  • 出于某种原因,JBoss AS 7.2无法下载(这本身就是一个问题)。但是AS7.2和7.1.1之间有什么变化呢?如果我们在7.1.1上测试,构建在7.2上不能工作的风险是什么? 谢谢

  • 问题内容: 这两个代码段之间有什么区别: 结果不完全一样吗? 问题答案: 在该代码中没有区别,在两种情况下它的求和结果都是 真正的区别是: 在第一种情况下,向下转换预期将始终成功(即使它为nil),因此,如果返回的不是其实例(或从其继承的类的实例),则它将在运行时失败。该表达式返回一个可选 在第二种情况下,强制类型转换是可选的:如果返回的对象既不是子类的实例也不是子类的实例,则向下转换的结果为ni

  • 问题内容: 如何解决此警告?如果我使用Spring 3.2,则会看到此警告: 问题答案: 显然这是“正常的”,一切仍然应该正常工作。可能在中有一个(匿名)内部类。

  • 任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系统处理缓慢,严重时会使系统崩溃。 例如,前面在介绍文件操作时,一直强调打开的文件最后一定要关闭,否则会程序的运行造成意想不到的隐患。但是,即便使用 close() 做好了关闭文件的操作,如果在打开文件或文件操作过程中抛