Kotlin内置函数apply、let、run、with、also等区别
Applyapply函数可看作一个配置函数,可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda给apply函数执行,它会返回配置好的接受者
val file1 = File("/User/geowin/hello.txt")file1.apply { // this: File setWritable(true) setReadable(true) setExecutable(false)}
可以看到,调用一个个函数类配置接受者时,变量名就省略了,这是因为,在lambda表达式中,apply能让每个配置函数都作用于接受者,这种行为有时又叫做相关作用域,因为lambda表达式里的所有函数调用都是针对接收者的,或者说,它们是针对接受者的隐式调用.
letlet函数能使某个变量作用于lambda表达式里,让it关键字能引用它。let与apply比较,let会把接受者传给lambda,而apply什么都不传,匿名函数执行完,apply会返回当前接受者,而let会返回lambda的最后一行。
fun main() & ...
Starting SwiftUI -- 创建表单
创建表单
默认文本视图包装在Form里面,就可以创建基本表单。
var body: some View { Form { Text("Hello SwiftUI 1") Text("Hello SwiftUI 2") }}
tips: 表单最多添加10行,超过10行是不允许的,这是SwiftUI的限制
如果表单包含11行及以上内容,需要将内容包裹在Group中:
Form{ Group{ Text("Hello SwiftUI 1") Text("Hello SwiftUI 2") Text("Hello SwiftUI 3") Text("Hello SwiftUI 1") Text(&q ...
Starting SwiftUI -- NavigationBar
默认情况下,iOS允许我们在屏幕上的任何地方放置内容,包括在系统时钟和主指示器下。这看起来不太好,这就是为什么默认情况下,SwiftUI会确保组件放置在系统UI或设备圆角无法覆盖的区域中,这一区域称为安全区域。
在iPhone 11上,安全区域的范围从略低于刘海到略高于主指示器(底部白条)。您可以在这样的用户界面中看到它的运行:
struct ContentView: View { var body: some View { Form{ Section{ Text("Hello Swift") } } }}
表单是可以上下滚动的,向上滑动的时候,状态栏可能会覆盖表单,影响阅读。
常见的解决办法是,在顶部增加一个导航栏NavagationView。导航栏有标题和按钮,在SwiftUI中,它们还让我们能够在用户执行操作时显示新视图。
struct ContentView: Vi ...
Starting SwiftUI -- Modifying Program State
在SwiftUI开发人员中有一种说法是,我们的“视图是他们状态的函数(views are a function of their state)”,但这虽然只是少数几句话,但一开始对您来说可能毫无意义。
如果您正在玩格斗游戏,那么您可能会丧生,夺取一些积分,收集一些财宝,甚至可能会捡起一些强大的武器。在编程中,我们称这些为状态-描述游戏当前状态的有效设置集合。
当您退出游戏时,该状态将被保存,并且当您稍后返回游戏时,您可以重新加载游戏以回到原来的状态。但是,在您玩游戏时,这全都叫做state:所有整数,字符串,布尔值等等,都存储在RAM中以描述您现在正在做什么。
当我们说SwiftUI的视图是其状态的函数时,我们的意思是用户界面的外观(人们可以看到的东西以及可以与之交互的东西)由程序的状态决定。例如,他们只有在文本字段中输入自己的姓名后才能点击“继续”。
这本身听起来似乎很明显,但这实际上与之前使用的替代方案有很大不同:您的用户界面由一系列事件决定。因此,用户现在看到的是因为他们已经使用您的应用程序已有一段时间,利用了各种功能,可能已经登录或刷新了数据,等等。
“事件顺序”方法意味着很难 ...
Jekyll 运行错误
Jekyll 运行时发生错误:
/Library/Ruby/Gems/2.6.0/gems/bundler-2.1.4/lib/bundler/runtime.rb:312:in `check_for_activated_spec!':You have already activated i18n 1.8.3, but your Gemfile requires i18n 0.9.5.Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
解决办法:
bundle update
修改 Gemfile.lock 将 i18n 配置升级为1.8.3
bundle exec jekyll serve
再次运行项目
Kotlin编程第一课(目录)
基础篇Kotlin编程第一课–(基础篇)01 Kotlin基础语法:正式开启学习之旅Kotlin编程第一课–(基础篇)02 面向对象:理解Kotlin设计者的良苦用心Kotlin编程第一课–(基础篇)03 Kotlin原理:编译器在幕后干了哪些“好事”?Kotlin编程第一课–(基础篇)04 | 实战:构建一个Kotlin版本的四则运算计算器Kotlin编程第一课–(基础篇)05 object关键字:你到底有多少种用法?Kotlin编程第一课–(基础篇)06 扩展:你的能力边界到底在哪里?Kotlin编程第一课–(基础篇)07 高阶函数:为什么说函数是Kotlin的“一等公民”?Kotlin编程第一课–(基础篇)08 实战:用Kotlin写一个英语词频统计程序Kotlin编程第一课–(基础篇)加餐一 初识Kotlin函数式编程Kotlin编程第一课–(基础篇)09 委托:你为何总是被低估?Kotlin编程第一课–(基础篇)10 泛型:逆变or协变,傻傻分不清?Kotlin编程第一课–(基础篇)11 注解与反射:进阶必备技能Kotlin编程第一课–(基础篇)12 ...
Kotlin编程第一课--(Android项目篇)35 用Kotlin写一个GitHub Trending App
这节课,我们一起来用 Kotlin 和 Jetpack 写一个简单的 Android 应用。为了便于理解,这个应用的功能会尽量简单,即使你对 Android 不是特别熟悉,跟着课程的引导,你也能轻松完成。
准备工作在之前的课程中,我们的实战项目都是基于 JVM 的,并没有涉及过 Android 相关的配置。因此,如果你的电脑没有 Android 开发的环境的话,那么可能需要做一些额外的配置。当然,在你已有 Java 环境的前提下,想要配置 Android 开发环境并不麻烦,你可以去搜索一些相关的Android 开发环境配置的教程。
那么,要进行 Android 开发,我们可以使用 IntelliJ,也可以使用 Android Studio,后者针对 Android 开发做了很多定制化,也是免费的,这里我也建议你去下载 Android Studio。
当配置好所有的环境以后,我们就可以像创建 Kotlin 工程一样,来创建一个新的 Android 工程了。
然后,当你创建好工程以后,就可以尝试运行代码了,这时候你大概率会看到一个 Hello World 的初始界面。
接下来,我们就正式 ...
Kotlin编程第一课--(Android项目篇)34 Kotlin与Jetpack简直是天生一对!
今天,我们来聊聊 Android 的 Jetpack。
在我看来,Kotlin 和 Jetpack,它们两个简直就是天生一对。作为 Android 开发者,如果只用 Kotlin 不用 Jetpack,我们其实很难在 Android 平台充分发挥 Kotlin 的语言优势。而如果我们只用 Jetpack 而不用 Kotlin,那么,我们将只能用到 Jetpack 的小部分功能。毕竟,Jetpack 当中有很多 API 和库,是专门为 Kotlin 提供的。
经过前面课程内容的学习,相信现在你已经对 Kotlin 十分熟悉了,那么,接下来就让我们来看看 Jetpack 吧!这节课里,我会为你介绍 Jetpack 核心库的基本概念、简单用法,以及它跟 Kotlin 之间的关系,从而也为我们下节课的实战项目打下基础。
Jetpack 简介Jetpack,它有“喷气式背包”的意思。对于我们开发者来说,它其实就是 Google 官方为我们提供的一套开发套件,专门用来帮助 Android 开发者提升开发效率、提升应用稳定性的。
Android Jetpack,最初的宣传图标,就是“穿着喷气式背包 ...
Kotlin编程第一课--(Android项目篇)33 Java Android开发者还会有未来吗?
在过去的几十讲里,我们把 Kotlin 的基础语法和核心难点协程,都全面学习了一遍,从原理到实战,从协程的核心挂起函数、launch 等,到探究它们的源码定义,可以说我们已经基本掌握了 Kotlin 的核心知识点与特性,你也应该可以在工作中使用 Kotlin 来解决实际问题了。如果你发现自己对这些知识的掌握还有不少漏洞,也别着急,可以再回头复习一下相应部分的内容,或者在留言区提问,我会给你解答。
那么,从这节课起,我会带你来看看 Kotlin 在实践场景中,应用得最普遍、最广泛的领域,Android。我们一起来学习下如何结合所学的 Kotlin 知识,来高效开发 Android 应用。
今天这节课,我们先来聊聊 Kotlin 和 Android 的关系,让你对 Android 的现状与未来的发展方向有一个清晰的认识。
虽然 Kotlin 是面向多个平台的(如 JVM、Native、JS 等),不过我们在讨论 Kotlin 的同时,难免也会讨论下 Android。甚至,很多开发者都是因为 Android 才开始接触 Kotlin 的。
说起 Kotlin 与 Android,就不得不提 ...
Kotlin编程第一课--(源码篇)32 图解Flow:原来你是只纸老虎?
今天我们来研究 Flow 的源代码。
经过前面的学习,我们已经知道了,Channel 和 Flow 都是数据流,Channel 是“热”的,Flow 则是“冷”的。这里的冷,代表着 Flow 不仅是“冷淡”的,而且还是“懒惰”的。
除了“冷”这个特性以外,Flow 从 API 的角度分类,主要分为:构造器、中间操作符、终止操作符。今天这节课,我们将会从这几个角度来分析 Flow 的源码,来看看它的这几类 API 是如何实现的。
经过这节课的学习,你会发现:虽然 Flow 的功能看起来非常高大上,然而它的原理却非常的简单,是一只名副其实的“纸老虎”。
Flow 为什么是冷的?在正式开始研究 Flow 源代码之前,我们首先需要确定研究的对象。这里,我写了一段 Demo 代码,接下来我们就以这个 Demo 为例,来分析 Flow 的整个执行流程:
// 代码段1fun main() { val scope = CoroutineScope(Job()) scope.launch { testFlow() } Thread. ...