swift关键字as,as!,as?

IT教程 1年前 (2020) https://www.renrenfan.com.cn
458

as as

在学习swift开发,其中有许多在其他语言中没见过的东西,比如关键字as。

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        if segue.identifier == "ResultsSegue" {
            let resultsViewController = segue.destination as! ResultsViewController
            resultsViewController.responses = answerChosen
            
        }
    }

上面这个函数是swift中定义好的,在使用的时候需要去重写这个函数。这里不提这个函数,简单说就是传参的函数。

要想了解这个函数,可看:https://blog.csdn.net/wufeifan_learner/article/details/89083745

上述几行代码有一个十分有趣的关键字“as”,这个关键字之前没见过,所以在这里总结一下,供自己及他人参考。

说as是关键字,其实不准确,具体说这是个操作符。这个操作符的作用是:将派生类转换为基类

import UIKit

//number1是int类型的
var number1 = 1
print(number1)

//这里将int类型的number2转换成了Float类型
var number2 = 1 as Float
print(number2)

//利用强制转换
var number3 = 1
var number4 = (Float)(number3)
print(number3)
print(number4)

swift关键字as,as!,as?

苹果官方开发手册中给了一个例子,我改写一下:

class Animal {}
class Dog: Animal {}

let a = Dog()
a as Animal

从子类到父类的转换,这样是可行的。这个转换被官方称为“Guaranteed conversion”。

  • Guaranteed conversion of a value of one type to another, whose success can be verified by the Swift compiler. For example, upcasting (i.e., converting from a class to one of its superclasses) or specifying the type of a literal expression, (e.g., 1 as Float).
  • 一个类型的值可担保转换到另一个类型,这种转换的成功可以由编译器来保证。例如:向上转换(例:从一个类转换到它的父类),或指明一个文本表达(例:将1转换成Float型)

还有一种转换方式,操作符为 as! ,被官方成为强制转换"Forced conversion"

  • Forced conversion of one value to another, whose safety cannot be guaranteed by the Swift compiler and which may cause a runtime trap. For example downcasting, converting from a class to one of its subclasses.
  • 一个值强制转换为另一个值,它的安全性不能被编译器保证,因此它可能造成运行时错误。例如向下转换,将一个类向它的派生类转换。

Swift 1.2 separates the notions of guaranteed conversion and forced conversion into two distinct operators. Guaranteed conversion is still performed with the as operator, but forced conversion now uses the as!operator. The ! is meant to indicate that the conversion may fail. This way, you know at a glance which conversions may cause the program to crash.

Swift 1.2 将可担保转换和强制转换的概念分成了两个独特的操作符。可担保转换仍保留as作为操作符,但是强制转换现在用as! 操作符。! 意味着转换可能失败。这样,你就能一眼知道那个转换可能导致程序崩溃。

class Animal {}
class Dog: Animal {}

let a: Animal = Dog()
a as Dog		// 报错,不能从Animal向Dog进行可担保转换
				// 你想用as! 代替as 么?

a as! Dog		// 强制转换可以通过编译

let d = Dog()
d as Animal		

还有一种转换是as"has"> class Animal {} class Cat: Animal {} class Dog: Animal { var name = "Spot" } let dog: Dog? = nil dog?.name // 评估为nil dog!.name // 引发运行时错误 let animal: Animal = Cat() animal as? Dog // 评估为nil animal as! Dog // 引发运行时错误

啥意思?

就是说:第一个转换的时候,dog是Dog类型的,并且dog可以为nil,所以后面调用dog类中对象的时候应该用?,若用!则会运行时报错。因为强行调用不能为空。

第二个Animal被定义为Animal类型,并且用Cat对其进行初始化。当让猫类型的animal转换成狗类型,若失败则返回空。而下面的强制转换,若失败就直接报错抛出异常了。

所以我们的程序,segue.destination as! ResultsViewController,就是让segue.destination转换成ResultsViewController类型。而segue.destination是UIViewController的子类,ResultsViewController也是UIViewController的子类。

参考文献:苹果官方开发手册

swift里 as、as!、as?区别

本文总结 as、as!、as? 这三种类型转换操作符的异同,以及各自的使用场景。 as 有保证的转换,从派生类转换为基类的向上转型(upca

SwiftScribe如何使用 AI音频转录工具SwiftScribe最全

wiftScribe的基本功能是把音频资料转录成文字,以解决消耗大量时间逐字听写转录的问题。SwiftScribe支持上传时长1个小时以内的wav

文章回顾

大家看了本文swift关键字as,as!,as?的精彩教程资源内容,是不是对swift关键字as,as!,as?了解更多,真心希望swift关键字as,as!,as?能帮助到你, 小编会一直给你带来更多教程资源文章信息。

版权声明:5634ec69d0bd15bc 发表于 2020-04-13 1:26:54。

本文由第三方用户分享仅代表作者观点,不代表本网站立场,秉承互联网开放分享的精神,目的在于传递更多信息,加强各行业互通交流,但对内容不作任何保证或承诺,请读者自行参考斟酌。网站发布的信息(包含但不限于版式、图片、字体、文章等素材)由第三方用户分享,版权归原作者所有,本站不承担任何相关的版权纠纷等相关责任。如您认为本篇内容侵犯了您的权益,请与我们联系,我们会及时处理。

人人翻致力于国内用户最爱翻的资源网站大全

转载请注明:
本文标题:swift关键字as,as!,as?
本文地址:https://www.renrenfan.com.cn/s5158.html