本期概要

  • 本期论题:本年 8 月,把握与 App Store 专家会面沟通的时机
  • 本周学习:Swift 闭包中的变量捕获
  • 内容引荐:程序开发文档及资源网站
  • 摸一下鱼:一款体感识别空气投篮模拟器 App;To-D 杂志

本期论题

本年 8 月,把握与 App Store 专家会面沟通的时机

@师大小海腾:想让你的产品页愈加出色?对 TestFlight 或实施订阅有疑问?与 App Store 专家沟通探讨,了解怎么充分利用这些功能。探究怎么吸引新顾客、测验营销战略、添加订阅等等。在整个 8 月,Apple 将在多个时区以多种语言进行实时演讲和答疑。假如你是 Apple Developer Program 的成员,现在即可注册请求。

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

本周学习

收拾修改:Hello World

Swift 闭包中的变量捕获

了解 OC 的读者都了解,OC 中 Block变量捕获根据变量的类型不同和修饰符的不同,有引证和复制两种方法。然而这套逻辑直接套用到 Swift 的闭包捕获中是不成立的。Swift 捕获方法有两种:捕获列表、隐式捕获。

隐式捕获

隐式捕获即直接引证变量,这种方法是对变量指针的捕获,使其引证计数添加,在闭包效果域期间指针不会被释放。这类似于 Block 中对引证类型变量的捕获。区别在于 Swift 中即使是值类型的变量,捕获的也是该变量的指针而非值的复制,即闭包中执行时是变量改动后的新值。

var value = 10
    delay(seconds: 1) {
        print("value : \(value)")
    }
    value = 20
// 打印成果为 value: 20

简略了解便是,直接捕获捕获到的是变量指针,无论该指针指向的是引证类型变量,仍是值类型变量,都是在闭包执行时再经过指针去获取终究的值。所以在闭包执行之前改动变量值都会生效。

捕获列表

捕获列表又称为显式捕获,这种方法是对变量指针指向的值进行捕获。形式上表现出的特征是在闭包创立时就立即捕获指针的值,后续即使改动指针的指向,也不会影响闭包内的值 留意这儿改动的是指针指向,而非指针指向的值更新

var value = 10
    delay(seconds: 1) { [vle = value] in
        print("value : \(vle)")
    }
    value = 20
// 打印成果为 value: 10

需求留意的是:当运用捕获列表时,针对变量是引证类型仍是值类型,成果是不一样的,会涉及到复制仍是引证,这儿是和直接捕获有所差异的当地。

var per = PersonClosure(name: "哈哈", age: 10)
    delay(seconds: 1) { [per = per] in
        print("name: \(per.name) age: \(per.age)")
    }
    per.name = "xxi"

PersonClosure 是值类型,则改动 per.name的值不会影响闭包创立时捕获到的值。原因是值类型创立时是复制方法捕获的。后续改动不影响复制的值。

PersonClosure是引证类型,则闭包创立时对该 PersonClosure对象只是引证计数添加,per.name 会改动闭包执行时的值。 但是假如是 per = PersonClosure(name: "xxi", age: 10) 改动指针指向,则不会改动闭包内的捕获的变量值。(这儿便是上文所提到的:改动指针指向不会影响值,而改动指针指向的值更新会影响闭包执行)

弱引证捕获

弱引证捕获是捕获列表的一种特殊情况,不会导致引证计数的添加。由于变量类型是值类型时,捕获列表是直接复制,所以无法针对值类型的捕获列表运用弱引证。

弱引证捕获用来处理闭包的循环引证,类似 OC 中的 weak 修饰符的效果。

最终以一道测验题,来测验下是否了解了闭包的捕获方法:

class Pokemon: CustomDebugStringConvertible {
  let name: String
  init(name: String) {
    self.name = name
  }
  var debugDescription: String { return "<Pokemon \(name)>" }
  deinit { print("\(self) escaped!") }
}
func delay(seconds: Int, closure: @escaping ()->()) {
  let time = DispatchTime.now() + .seconds(seconds)
    DispatchQueue.main.asyncAfter(deadline: time, execute: DispatchWorkItem(block: {
        print("")
        closure()
    }))
}
func demo7() {
  var pokemon = Pokemon(name: "Mew")
  print("➡️ Initial pokemon is \(pokemon)")
  delay(1) { [capturedPokemon = pokemon] in
    print("closure 1 — pokemon captured at creation time: \(capturedPokemon)")
    print("closure 1 — variable evaluated at execution time: \(pokemon)")
    pokemon = Pokemon(name: "Pikachu")
    print("closure 1 - pokemon has been now set to \(pokemon)")
  }
  pokemon = Pokemon(name: "Mewtwo")
  print(" pokemon changed to \(pokemon)")
  delay(2) { [capturedPokemon = pokemon] in
    print("closure 2 — pokemon captured at creation time: \(capturedPokemon)")
    print("closure 2 — variable evaluated at execution time: \(pokemon)")
    pokemon = Pokemon(name: "Charizard")
    print("closure 2 - value has been now set to \(pokemon)")
  }
}
输出成果为:
➡️ Initial pokemon is <Pokemon Mew>
 pokemon changed to <Pokemon Mewtwo>

closure 1 — pokemon captured at creation time: <Pokemon Mew>
closure 1 — variable evaluated at execution time: <Pokemon Mewtwo>
closure 1 - pokemon has been now set to <Pokemon Pikachu>
<Pokemon Mew> escaped!

closure 2 — pokemon captured at creation time: <Pokemon Mewtwo>
closure 2 — variable evaluated at execution time: <Pokemon Pikachu>
<Pokemon Pikachu> escaped!
closure 2 - value has been now set to <Pokemon Charizard>
<Pokemon Mewtwo> escaped!
<Pokemon Charizard> escaped!
  • Closures Capture Semantics: Catch them all!

内容引荐

收拾修改:夏天

1、Xamarin 文档 — 来自:Microsoft

@夏天:除了常见的 React Native、Flutter、Weex 之外,在跨渠道上还有一些值得尝试的跨渠道计划,比如来自 Microsoft 的 Xamarin 就答应你运用 .NET 代码和特定于渠道的用户界面生成适用于 Android、iOS 和 macOS 的本机使用。或许,这不失为一个新的全栈挑选。

2、Qt — 来自:Qt Company

@夏天:除了上文的 C# 之外,由 Qt Company 开发的跨渠道 C++ 图形用户界面使用程序开发结构。C ++ 拥有杰出的功能,那么用它开发出来的桌面或移动端使用是否能够在编写之初就能够凌驾在其他使用之上呢?当然其包含的点还包含嵌入式及微控制器(MCU),一次学习,干啥都行。除了付费以外,似乎没啥缺点。

3、Geeks for Geeks — 来自:GeeksforGeeks

@夏天:一个对开发者来说很全面的网站,供给了算法,体系设计等根底内容。还供给了 Practice 和一些付费/免费的课程及文章。你也能够订阅他们的 YouTube 账号 观看视频课程,教程中的 CS Subject 适合很多入门或者根底不扎实的程序员。不过语言教育没有 Swift…

4、iOS Conf SG — 来自:iOS Conf SG

@夏天:号称东南亚最大的 iOS 开发者大会。从 2016 年举行至今已有 6 年,一个纯为 iOS 开发者举行的开发者大会。每年大概有 15 个左右的视频来叙述一些 iOS 相关的视频,你能够在 YouTube 进行观看。

摸一下鱼

收拾修改:师大小海腾

1、空气投篮:一款体感识别空气投篮模拟器 app。根据提示佩戴 Apple Watch,识别投篮手势动作,模拟真实的空心入网的空间音效。还有飞盘形式、巴掌形式、摩托形式等你探究。但是需求付费,价格 6 元,感兴趣的能够去体会一下。

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

2、TO-D 杂志:《TO-D 杂志》是一个专注于探讨全球 To-D 范畴相关产品、创业公司、融资等资讯的开源独立杂志。To-D 即 To Developers,它并非一个独立的范畴区分,它通常和 To-C, To-B 可能存在堆叠。我们熟知的 Jetbrains, Postman, GitLab 等都属于 To-D 产品。

《TO-D 杂志》最早为诞生在字节跳动内部的一份名为《To-D 观察室》的飞书文档,作者从 2021 年 12 月 23 号开端编写第一篇文章,每周在内网更新。方针读者首要为字节跳动内部的工程师、产品经理和对开发者范畴感兴趣的同学,而且受到我们的众多好评。后来于 2022 年 3 月 22 号开端在这儿正式对外发表。

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

3、dot-to-ascii:Graphviz to ASCII converter using Graph::Easy。

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

4、Popovers:一个显现弹窗的库。简略、现代、可高度定制。不无聊!

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

5、appsmith:一个用于构建内部东西的强壮的开源结构。

iOS 摸鱼周报 #64 | 与 App Store 专家会面交流

关于我们

iOS 摸鱼周报,首要分享开发过程中遇到的经验教训、优质的博客、高质量的学习材料、实用的开发东西等。周报库房在这儿:github.com/zhangferry/… ,假如你有好的的内容引荐能够经过 issue 的方法进行提交。别的也能够请求成为我们的常驻修改,一同维护这份周报。另可重视公众号:iOS生长之路,后台点击进群沟通,联络我们,获取更多内容。

往期引荐

iOS 摸鱼周报 #63 | Apple 企业家培训营已开放请求

iOS 摸鱼周报 #62 | Live Activity 上线 Beta 版

iOS 摸鱼周报 #61 |  Developer 设计开发加速器

iOS 摸鱼周报 #60 | 2022 Apple 高校优惠活动敞开