闭包存储属性初始化有什么好处?

2024-06-19

初始化类的属性时,此代码有什么区别以及优点/缺点:

1.

let menuBar:MenuBar = {
        let mb = MenuBar()
        return mb
    }()

and:

2.

let menuBar = MenuBar()

两个代码片段都声明并初始化存储的属性 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID255,但在第一个中它是通过闭包初始化的。您应该使用闭包设置存储属性的原因是:需要进行定制(例如调用方法);改编自《Swift 编程语言》(Swift 4.1) - 初始化:使用闭包或函数设置默认属性值 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID232:

如果存储属性的默认值需要一些自定义或 设置时,您可以使用闭包或全局函数来提供 该属性的自定义默认值。每当有一个新实例 属性所属的类型被初始化,闭包或 函数被调用,其返回值被指定为属性的 默认值。

这意味着您将能够执行以下操作:

let menuBar:MenuBar = {
    let mb = MenuBar()
    // for example, you'd need to call "doSomething" method
    // before returning the instance:
    menuBar.doSomething()
    return mb
}()

注意在存储的属性闭包的主体中,您将无法使用类/结构中的其他属性,因为它们被认为尚未初始化。例子:

struct MyType {
    let myString = "My String!"
    let myInt: Int = {
        let anInt = 101

        // this won't work
        print(myString)

        return anInt
    }()
}

上述代码片段的结果是出现编译时错误:

错误:实例成员“myString”不能在类型“MyType”上使用 打印(我的字符串)


此外在某些时候,建议将您的财产申报为lazy:

lazy var menuBar:MenuBar = {
     let mb = MenuBar()
     // for example, you'd need to call "doSomething" method
     // before returning the instance:
     menuBar.doSomething()
     return mb
 }()

意思是:

惰性存储属性是指初始值不是的属性 直到第一次使用时才计算。您指示了一个惰性存储 属性通过在其声明之前编写惰性修饰符来实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

闭包存储属性初始化有什么好处? 的相关文章

  • 动态隐藏状态栏时如何保留状态栏占用的空间?

    我倾向于隐藏状态栏 通过以下方式进行动画处理 var statusBarHidden Bool false didSet UIView animate withDuration Constants config shortAnimTime
  • 如何制作自定义组件属性?

    我需要帮助来制作一个控件属性 当您单击它时 它会弹出一个自定义对话框 例如设置 就像 TPicture 一样 有什么想法或建议吗 如果您的类用作其他组件的属性 并且您想使用对象检查器来调用对话框 那么您必须实现并注册一个自定义属性编辑器 例
  • Firebase Swift 3 获取数组中子项的列表

    我正在尝试从 Firebase 数据库获取列表数据 然后将其转换为数组 我在网上查看了很多示例 但从未成功运行 据我所知 下面的代码是我可以得到的 1 个错误的壁橱 ref child observe childAdded with sna
  • UIDatePicker,显示带有年份和时间的完整日期

    你能有一个UIDatePicker在 DatePicker 上显示日 月 年和时间 或者我需要进行自己的自定义UIPickerView i e 2000 年 11 月 12 日星期一 5 20 AM 目前日期选择器 datePickerMo
  • 带有委托构造函数的构造函数初始化列表执行顺序

    我有一个棘手的 C 问题 当您有一个带有委托构造函数的构造函数初始化列表时 列表执行顺序是什么 这里存在两个相互冲突的标准规则 1 构造函数初始化列表不是按列表顺序执行 而是按项目的声明顺序执行 2 构造函数初始化列表中的委托构造函数总是在
  • 修改作为参数传递给 Swift 函数的数组

    抱歉 新手问题 我还在学习 我遇到了一些奇怪的行为 并且找不到任何有关此的文档 我想知道你是否可以帮助指出我在这里做错了什么 Error 无法对不可变值使用变异成员 arr 是 let 常量 class mySingleton static
  • iOS 10.核心数据插入新对象 sigABRT

    我尝试了 forEntityName Game MyApp Game 在我的 dataManagerFile 中 let appDelegate UIApplication shared delegate as AppDelegate le
  • 获取最顶层的 UIViewController

    我似乎无法到达最顶端UIViewController无法访问UINavigationController 这是我到目前为止所拥有的 UIApplication sharedApplication keyWindow rootViewCont
  • Apple Watch 表 - 前 4 行未出现

    我在添加行时遇到问题WKInterfaceTable在苹果手表上 奇怪的是 无论我做什么 前 4 行都显示为空 我尝试手动添加行并循环 没关系 我相信我的代码很好 因为第五行和其他行看起来都很好 发生的情况如下 进一步滚动 My code
  • 究竟要消化什么并在 XMLDSIG 上签名以及如何进行? (或者,OSX 本机客户端与服务器上计算的 XMLDSIG 不匹配)

    我正在尝试使用封装签名 sha1 摘要和 rss sha1 签名按照 XMLDSIG 规范对 xml 文档进行签名 并且服务器不断返回 297 拒绝 签名与计算的 结果 不匹配 297 Rejeicao Assinatura difere
  • 无需 nib 以编程方式实例化 UIViewController

    我想创建一个UIViewController以编程方式进行 无需使用笔尖或故事板 我认为实施该计划就足够了UIViewController as class TestViewController UIViewController overr
  • UIImage 在编码/解码时不等效

    我一直在对我的模型进行一些测试 以确保当我将它们编码为 JSON 然后使用它们解码回来时它们是相等的JSONEncoder Decoder 然而 我的一项测试失败了 罪魁祸首是UIImage 我已确保在编码 解码过程中没有抛出任何错误 首先
  • Google 登录服务器验证码无 iOS?

    我们让 Google 登录您的应用程序 我们在请求登录时提供服务器客户端 ID 我们得到的 user serverAuthCode 为 nil 我们的要求如下 func googleLogin var configureError NSEr
  • Swift上传文件到PHP服务器

    因此 我将文件从 swift 上传到 PHP 服务器 POST 请求按预期到达 带有标头和所有内容 但我无法从中获取任何内容 FILES 它只是一个空数组 我显然在 Swift 方面做错了什么 这是我的代码 func testUpload
  • 从 Firebase Swift 检索信息的好方法

    我和我的朋友正在 swift 上开发一个 IOS 项目 并集成了 新的 Firebase 我们能够写入 Firebase 数据库 但是我们在检索数据时遇到了问题 我们有一个 tableView 控制器 我们希望从 Firebase 数据库填
  • 如何在 Swift 中使用具有相同协议变量的多个协议?

    我很快就实现了两个协议 GADCustomEventInterstitial and GADCustomEventBanner 这两个协议都需要一个名为delegate delegate每个协议中的类型不同 因此会产生冲突 class Ch
  • Swift 和 Cocoapods - 缺少必需的模块

    我正在尝试制作一个 Swift 框架 该框架依赖于两个库 阿拉莫菲尔 https github com Alamofire Alamofire and SwiftyJSON https github com SwiftyJSON Swift
  • Swift 闭包异步执行顺序

    在我的模型中 有函数来获取需要完成处理程序作为参数的数据 func fetchMostRecent completion sortedSections TableItem gt self addressBook loadContacts c
  • XCode 12.5 缺少权利 com.apple.developer.linked-appclip-app-identifiers

    将 Xcode 版本更新到 12 5 后 我遇到了 App Clip 问题 在 App Store Connect 上传期间 我收到警告 TMS 90876 Missing entitlement This app contains an
  • Swift 3 - 如何从另一个视图插入 TableView 单元格?

    我正在使用 Swift 3 Xcode 8 2 我试图弄清楚如何从选项卡式视图控制器的另一个选项卡将单元格插入到表视图中 我的表视图 class MyTableView UITableViewController var items Ite

随机推荐

  • JavaScript 中最长的通用前缀

    我正在尝试解决 Leet Code 挑战14 最长公共前缀 https leetcode com problems longest common prefix 编写一个函数来查找字符串数组中最长的公共前缀字符串 如果没有公共前缀 则返回空字
  • 如何有效地比较 pandas DataFrame 中的行?

    我有一个 pandas 数据框 其中包含雷击记录以及时间戳和全球位置 格式如下 Index Date Time Lat Lon Good fix 0 1 20160101 00 00 00 9962692 7 1961 60 7604 1
  • 如何将QR码中的3个方块替换为圆圈以使用Paint android使用zxing自定义QR码?

    我用它作为自定义的参考 从方形到圆形使用zxing生成的QR码它是在java中所以我尝试将它转换为在android中使用 使用 zxing 生成具有自定义点形状的 QR 码 https stackoverflow com questions
  • 用于 S3 私有文件的 ActiveStorage

    到目前为止 我一直在使用 Paperclip 将一些文件上传到 S3 其中一些文件不是公开的 Paperclip 允许通过以下位将一些文件作为私有文件上传 has attached file image styles large 2000x
  • 为 Rails 上的 postgresql 创建用户

    我选择 postgresql 作为我的 Rails 数据库 但当我尝试运行 rake db create all 时 我遇到了一个明显常见的错误 即 致命 角色 app 不存在 我找到了两种解决方案 但我不确定哪一种是正确的 有一个网站说
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 如何设置旋转元素背面的样式?

    我有一个figure它是可旋转的 通过用户输入任意角度 该旋转明显地使用transition财产 当该元件旋转超过 90 度 90 度时 元件的背面可见 我想对元素的通常隐藏的一面进行与正面不同的设计 但我不确定如何实现这一点 figure
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • Swift 运行时库与 Swift 标准库

    In this 关于如何使用 CocoaPods 的教程 https www raywenderlich com 97014 use cocoapods with swift我无法理解以下段落 与 Objective C 不同 标准 Swi
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • Rails 中的助手 - 构建 html 字符串时的最佳方法是什么?

    我通常这样写助手 def bloco vazio texto btn args titulo content tag h3 Vazio p content tag p texto content tag div titulo tag hr
  • ProcessPoolExecutor 传递多个参数

    ESPN播放器免费 class ESPNPlayerFree def init self player id match id match id team 团队名单1 277906 cA2i150s81HI3qbq1fzi za1Oq5CG
  • 数字和小数的输入掩码

    在测试我的程序后 我发现了以下错误 我在 sqlserver 中的表包含 价格数字 6 2 我的程序的用户输入价格 555 00 就很好了 但是当他输入 555555 时 这是错误的 所以我需要指定掩码 其中尾数是可选的 0 到 999 小
  • 对象克隆库的 Flash 复制?

    这可能是一个非常简单的问题 我只是不知道如何解决 我有一个想要复制的对象 但不知道如何进行 这是我的尝试 var myObj new ObjectClass var duplicate myObj duplicate null myObj
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 闭包存储属性初始化有什么好处?

    初始化类的属性时 此代码有什么区别以及优点 缺点 1 let menuBar MenuBar let mb MenuBar return mb and 2 let menuBar MenuBar 两个代码片段都声明并初始化存储的属性 htt