美文网首页
被误解的inout

被误解的inout

作者: 小時間光 | 来源:发表于2021-03-17 19:27 被阅读0次

我的博客

在Swift中,函数的参数默认都是常量是不可以修改的,如果我需要在函数内部修改函数的某个参数,或者通过参数返回内容,就需要用inout关键字来修饰这个参数,在调用时在这个参数前加上&即可。

如老师需要为学生的笔试成绩加上30分的平时成绩,就需要用到inout参数:

func configStudent(_ fraction: inout Int) -> Int {
    return fraction + 30
}

var num = 53
configStudent(&num)

这里的&num写法,在其他C系列语言中,如C/C++Objective-C中,一般会认为是在传递变量的指针。实际上我在此之前也是这么认为的,直到在读到官方文档函数部分章节后才知道其实inout关键字的用途并非如此。

1、inout 只是 in - out

在官方文档中是这样说的:

You write an in-out parameter by placing the inout keyword right before a parameter’s type. An in-out parameter has a value that’s passed in to the function, is modified by the function, and is passed back out of the function to replace the original value.

文档上说的很明确,inout就是把参数传递给函数,被函数修改之后再替换初始值。也就是说inout就只是简单的in-out而没有其他的意思。

2、inout的使用

2.1、变量可以、常量不可以
  • (1) 、使用inout只能修饰变量
func configStudent(_ fraction: inout Int) -> Int {
    return fraction + 30
}
let num = 53
configStudent(&num)

在编译的时候,系统会直接报错Cannot pass immutable value as inout argument: 'num' is a 'let' constant

修改代码var num = 53编译成功,

var num = 53
configStudent(&num)
  • (2) 、可变数组中的常量也可以用inout

但是同样的,如果我修改一个可变数组中的参数吗?

var testArray = [1,2,3,4,5,6]
testArray[1] = configStudent(&testArray[1]) // [1, 32, 3, 4, 5, 6]

编译代码,正常运行,说明数组中的下标操作也可以使用inout来修饰参数。

  • (3)、自定义类型属性使用inout关键字

如我现在要记录学生在上课签到时的位置,在得到学生的位置信息后再做一次校正处理,使用自定义类型,代码如下:

struct Location {
    var lat: Double
    var lon: Double
}

func configLocation(_ num: inout Double) -> String {
    return "\(num + 0.01)"
}

// 调用
var location = Location(lat: 37.33020, lon: -122.024348)
configLocation(&location.lat)

编译代码,正常运行。

使用上面的代码,我在得到学生的位置不仅要知道经纬度,还想知道这个学生的平时成绩,一般默认情况下老师会给所有学生设置平时成绩为30分,新增fraction属性作为平时成绩,代码如下:

struct Location {
    var lat: Double
    var lon: Double
    
    var fraction: Int {
        return 30
    }
}

func configFraction(_ fraction: inout Int) -> Int {
    return fraction + 30
}
configFraction(&location.fraction)

此时我再次运行代码,编译时直接报错: Cannot pass immutable value as inout argument: 'fraction' is a get-only property,也就是说对于自定义类的只读属性,不能使用inout参数;

最终的结论是:自定义类型的属性同时有getset方法,也可以作为inout参数。自定义类型中的只读属性不能使用inout参数


本文主要说了我曾经对inout修饰参数的一些误解,及inout修饰参数的使用,如果有不对的地方请指出。

本文参考:the swift programming language:Functions

本文代码

相关文章

  • 被误解的inout

    我的博客[https://dengfeng520.github.io/] 在Swift中,函数的参数默认都是常量是...

  • 2017-12-26

    swift泛型的使用 ''' func exchange( a: inout T, b : inout T){//...

  • 《Swift进阶》ReadingNotes_5

    inout: inout修饰的参数只能传递lvalue,inout参数会变量优化成引用传递。而不是传入传出时的复制...

  • inout 参数

    在函数的参数中,可以传inout类型参数,如下: 其中inout关键字,当引用相应有inout参数的函数时,参数前...

  • [swift 进阶]读书笔记-第六章:函数 C6P4 inou

    第六章:函数(function) 6.4 inout参数和可变方法(inout parameter and mut...

  • 2019-09-27swift内嵌函数内存安全

    一:内嵌函数引用inout的参数时不能是逃逸的 func func1(inoutPara para : inout...

  • inout

    inout: 让值类型以引用方式传递(即传递的是内存地址),这样以后的操作会影响原始数据。 inout修饰的参数不...

  • swift多元组

    比如输入交换,一般这样写 func swapMe1(a:inout T,b:inout T) {let temp ...

  • Swift 中的内存安全性

    内存安全 inout 参数访问冲突 在函数体内,同时读、写 stepSize 这块内存区域。 inout 参数访问...

  • 被误解

    乔怀揣宗教般的执着和虔诚守望在不羁青春的麦田里,不经意间,仿佛看到真相的某个侧影,顿时如同献祭般将自由与灵魂轻轻摇...

网友评论

      本文标题:被误解的inout

      本文链接:https://www.haomeiwen.com/subject/fbwecltx.html