美文网首页
Swift inout关键字

Swift inout关键字

作者: Yimmm | 来源:发表于2022-06-11 17:33 被阅读0次

作者想要达到的实现:在Swift组件化搭建中,让属性传给闭包作为参数供外部Model构建函数使用,使用时在外部修改闭包参数就可以对类中属性修改,从而达到使用一个构建函数就可以做到初始化。
解决方案:使用inout关键字修饰函数(闭包)参数,就可以让参数以地址的方式传递,而不是值的方式传递。

首先知道参数在函数中的两种传递方式:

  • 值类型 (常用)
    传递的是参数的一个副本,调用参数的过程中不会修改原始数据。

  • 引用类型(&xxx)
    把参数本身的引用(内存地址)传递过去,调用参数的过程可以修改原始数据。

inout关键字基础使用:

// inout关键字
class inoutTest: NSObject {
        
    func changeNum(_ number: Int) {
        // 如果直接修改参数,是会报错 Left side of mutating operator isn't mutable: 'number' is a 'let' constant
        // 因为参数传的是值,而不是内存地址
        number += 1
    }
}

// 添加inout关键字修饰参数
class inoutTest: NSObject {
    
    func changeNum(_ number: inout Int) {
        
        number += 1
    }
}
简单引用例子:
class TestViewController: UIViewController {
    var num: Int = 0
    // 点击测试
    func clickToTest() {
        
        let testClass = inoutTest()
        // 因为用了inout关键字修饰,这里传参时得用&num传属性内存地址
        testClass.changeNum(&num)
        // 打印测试
        print("YYY = \(num)")
    }

}

运行后调用clickToTest ()方法,控制台打印出来YYY = 1

———————————————我是分割线———————————————

知道了这个inout关键字的作用之后,就能解决一个通用的初始化构造函数完成必要的初始化啦!!!

1. 使用inout关键字修饰闭包参数:
import UIKit
/// 构建CollectionView的Model类
class VEBBaseCollectionViewModel: NSObject {
    
    /// 构建函数参数闭包
    public typealias cellModelsClosure = (inout [VEBBaseCollectionViewCellModel]) -> Void

    /// 数据源
    var cellModels = [VEBBaseCollectionViewCellModel]()
    
    init(cellModelsClosure: cellModelsClosure) {
        // 闭包inout修饰参数&cellModels,传的是数据源cellModels的内存地址
        cellModelsClosure(&cellModels)
    }
    
}

(inout [VEBBaseCollectionViewCellModel]) -> Void 其中使用inout修饰[VEBBaseCollectionViewCellModel]后,我们只需要传一个符合该类型的属性地址,就可以在外部构建函数中以参数方式修改数据源。

2. 其中VEBBaseCollectionViewCellModel的代码:
/// 构建CollectionViewCell的基础属性Model类
class VEBBaseCollectionViewCellModel: NSObject {
    
    /// Cell类名
    var cellClass: String!
    /// 标题
    var fieldTitle: String!
    /// 副标题
    var fieldSubTitle: String!
    /// 图片名
    var imageName: String!
    /// 图片URL
    var imageURL: String!
    /// 辅助字段
    var others: [String]!
    /// 是否只可读
    var isReadOnly: Bool!
    
    override init() {
        super.init()
    }
    
}

3.在适当处调用Model的构建函数
    /// 规定的通用组件构建类
    override func setCollectionCellModel() {
        
        let viewModel = VEBBaseCollectionViewModel { cellModels in
            
            let cellModel = VEBBaseCollectionViewCellModel()
            // 实现去model化开发组件,无业务代码嵌入,可以轻松重用各类基础Cell
            cellModel.cellClass = "VEBBookCoverStyle1CollectionViewCell"
            cellModel.fieldTitle = "标题名字"
            cellModel.imageURL = "图片的URL"
            // 这里的cellModels是闭包参数,可以直接修改到类中的属性
            cellModels.append(cellModel)
        }
    }

这样就能实现一个构建函数完成所需的初始化,简单易用,使用时还有提示构建所需要的参数。


构建函数

相关文章

  • Swift汇编分析inout关键字

    因为inout关键字比较简单,因此该文章篇幅相对比较短小。我们直到在swift中inout通常用来在函数内修改外部...

  • swift 关键字inout

    关键字inout:当我们需要通过一个函数来改变函数外面变量的值(以引用方式传递)。通俗的讲:就是使用inout关键...

  • Swift inout关键字

    1、inout定义 将值类型的对象用引用的方式传递。或者说地址传递。类似于ObjectC中的二级指针的意思 2、O...

  • Swift inout关键字

    作者想要达到的实现:在Swift组件化搭建中,让属性传给闭包作为参数供外部Model构建函数使用,使用时在外部修改...

  • 2017-12-26

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

  • Swift中一些常见的关键字二(if let,guard let

    在上一篇文章Swift中一些常见的关键字一(inout,defer,throw等)简单的介绍了几个关键字。本文续写...

  • swift之inout关键字

    在swift中,我们常常对数据进行一些处理。因为swift的计算属性,所以如果不是大量重复性处理,基本可以在set...

  • Swift之inout关键字

    在Swift中,常用的字符串、数组和字典,由OC中的NSString、NSArray和NSDictionary转变...

  • swift之inout

    swift中需要对参数只进行修改,需要用到inout 关键字,调用函数时加& 喜欢可以加Q群号:874826112...

  • inout 参数

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

网友评论

      本文标题:Swift inout关键字

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