Swift inout

转自

题目:二叉树遍历

class TreeNode {  
    var val: Int  
    var left: TreeNode?  
    var right: TreeNode?  
}

前序遍历

func preorderTraversal(_ root: TreeNode?) -> [Int] {  
    var result: [Int] = []  
    guard let root = root else { return result } // 如果根节点为空,直接返回空数组  
      
    // 递归实现前序遍历  
    preorderTraversalHelper(root, &result)  
      
    return result  
}  
  
func preorderTraversalHelper(_ node: TreeNode, _ result: inout [Int]) {  
    if let node = node {  
        // 访问根节点  
        result.append(node.val)  
        // 遍历左子树  
        preorderTraversalHelper(node.left, &result)  
        // 遍历右子树  
        preorderTraversalHelper(node.right, &result)  
    }  
}

//中序遍历

func inorderTraversal(_ root: TreeNode?) -> [Int] {  
    var result: [Int] = []  
    guard let root = root else { return result } // 如果根节点为空,直接返回空数组  
      
    // 递归实现中序遍历  
    inorderTraversalHelper(root, &result)  
      
    return result  
}  
  
func inorderTraversalHelper(_ node: TreeNode, _ result: inout [Int]) {  
    if let node = node {  
        // 遍历左子树  
        inorderTraversalHelper(node.left, &result)  
        // 访问根节点  
        result.append(node.val)  
        // 遍历右子树  
        inorderTraversalHelper(node.right, &result)  
    }  
}

后续遍历

func postorderTraversal(_ root: TreeNode?) -> [Int] {  
    var result: [Int] = []  
    guard let root = root else { return result } // 如果根节点为空,直接返回空数组  
      
    // 递归实现后序遍历  
    postorderTraversalHelper(root, &result)  
      
    return result  
}  
  
func postorderTraversalHelper(_ node: TreeNode, _ result: inout [Int]) {  
    if let node = node {  
        // 遍历左子树  
        postorderTraversalHelper(node.left, &result)  
        // 遍历右子树  
        postorderTraversalHelper(node.right, &result)  
        // 访问根节点  
        result.append(node.val)  
    }  
}

inout是 Swift 中的关键字,可以放置于参数类型前,冒号之后。使用 inout之后,函数体内部可以直接更改参数值,而且改变会保留。

func swap(resSct: inout ResolutionStruct) {
withUnsafePointer(to: &resSct) { print("During calling: ($0)") }
let temp = resSct.height
resSct.height = resSct.width
resSct.width = temp
}

var iPhone6ResoStruct = ResolutionStruct(height: 1334, width: 750)
print(iPhone6ResoStruct)
withUnsafePointer(to: &iPhone6ResoStruct) { print("Before calling: (0)") } swap(resSct: &iPhone6ResoStruct) print(iPhone6ResoStruct) withUnsafePointer(to: &iPhone6ResoStruct) { print("After calling: \(0)") }
小结:值类型变量作为参数传入函数,外界和函数参数的内存地址一致,函数内对参数的更改得到了保留。
需要注意的是:
1.使用 inout 关键字的函数,在调用时需要在该参数前加上 & 符号
2.inout 参数在传入时必须为变量,不能为常量或字面量(literal)
3.inout 参数不能有默认值,不能为可变参数
4.inout 参数不等同于函数返回值,是一种使参数的作用域超出函数体的方式
5.多个inout 参数不能同时传入同一个变量,因为拷入拷出的顺序不定,那么最终值也不能确定

struct Point {
var x = 0.0
var y = 0.0
}

struct Rectangle {
var width = 0.0
var height = 0.0
var origin = Point()

var center: Point {
    get {
        print("center GETTER call")
        return Point(x: origin.x + width / 2,
                     y: origin.y + height / 2)
    }
    
    set {
        print("center SETTER call")
        origin.x = newValue.x - width / 2
        origin.y = newValue.y - height / 2
    }
}

func reset(center: inout Point) {
    center.x = 0.0
    center.y = 0.0
}

}

var rect = Rectangle(width: 100, height: 100, origin: Point(x: -100, y: -100))
print(rect.center)
rect.reset(center: &rect.center)
print(rect.center)

// center GETTER call
// Point(x: -50.0, y: -50.0)

// center GETTER call
// center SETTER call

// center GETTER call
// Point(x: 0.0, y: 0.0)
inout参数的传递过程:

当函数被调用时,参数值被拷贝
在函数体内,被拷贝的参数修改
函数返回时,被拷贝的参数值被赋值给原有的变量

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 8,041评论 2 9
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 9,387评论 0 6
  • 学习目标 由于已经有了Java编程思想,所以着重了解Swift语言特有的特性,与Java不一样的地方。最终目的是可...
    Zhouztashin阅读 4,949评论 0 2
  • 123.继承 一个类可以从另外一个类继承方法,属性和其他特征。当一个类继承另外一个类时, 继承类叫子类, 被继承的...
    无沣阅读 5,279评论 2 4
  • 构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程。这个过程包含了为实例中的每个属性设置初始值和为其...
    零度_不结冰阅读 1,796评论 0 0

友情链接更多精彩内容