Kotlin编程第一课--(基础篇)03 Kotlin原理:编译器在幕后干了哪些“好事”?
在前面两节课里,我们学了不少 Kotlin 的语法,其中有些语法是和 Java 类似的,比如数字类型、字符串;也有些语法是 Kotlin 所独有的,比如数据类、密封类。另外,我们还知道 Kotlin 和 Java 完全兼容,它们可以同时出现在一个代码工程当中,并且可以互相调用。
但是,这样就会引出一个问题:Java 是如何识别 Kotlin 的独有语法的呢?比如,Java 如何能够认识 Kotlin 里的“数据类”?
这就要从整个 Kotlin 的实现机制说起了。
所以,今天这节课,我会从 Kotlin 的编译流程出发,来带你探索这门语言的底层原理。在这个过程中,你会真正地理解,Kotlin 是如何在实现灵活、简洁的语法的同时,还做到了兼容 Java 语言的。并且你在日后的学习和工作中,也可以根据今天所学的内容,来快速理解 Kotlin 的其他新特性。
Kotlin 的编译流程在介绍 Kotlin 的原理细节之前,我们先从宏观上看看它是如何运行在电脑上的,这其实就涉及到它的编译流程。
那么首先,你需要知道一件事情:你写出的 Kotlin 代码,电脑是无法直接理解的。即使是最简单的pri ...
Kotlin编程第一课--(基础篇)02 面向对象:理解Kotlin设计者的良苦用心
这节课,我们来学习 Kotlin 的面向对象编程:类、接口、继承、嵌套,以及 Kotlin 独有的数据类和密封类。
面向对象(Object Oriented)是软件开发方法,也是计算机界应用最广的一种编程范式。它是把程序的“数据”和“方法”作为一个整体来看待,将其抽象成了一个具体的模型,从而更贴近事物的自然运行模式。它的特点是简单易懂,符合人类的思维模式。
在“面向对象”的概念上,虽然 Kotlin 和 Java 之间有一定的语法差异,但底层的思想是没有变的。比如 Java 和 Kotlin 当中,都有类、接口、继承、嵌套、枚举的概念,唯一区别就在于这些概念在两种语言中的具体语法不同。我们需要做的,仅仅只是为我们脑海里已经熟知的概念,再增加一种语法规则而已。
而如果你没有 Java 基础也没关系,今天这节课要学习的内容,几乎是所有编程语言都需要掌握的概念。在掌握了 Kotlin 面向对象的编程思想后,如果你再去学习其他编程语言,你也照样可以快速迁移这些知识点。
当然,Kotlin 作为一门新的语言,它也创造了一些新的东西,比如数据类、密封类、密封接口等。这些 Kotlin 的新概念,会 ...
Kotlin编程第一课--(基础篇)01 Kotlin基础语法:正式开启学习之旅
从今天开始,我们就正式踏上 Kotlin 语言学习与实践的旅途了。这节课,我想先带你来学习下 Kotlin 的基础语法,包括变量、基础类型、函数和流程控制。这些基础语法是程序最基本的元素。
不过,如果你有使用 Java 的经验,可能会觉得今天的内容有点多余,毕竟 Kotlin 和 Java 的基础语法是比较相似的,它们都是基于 JVM 的语言。但其实不然,Kotlin 作为一门新的语言,它包含了许多新的特性,由此也决定着 Kotlin 的代码风格。如果你不够了解 Kotlin 的这些新特性,你会发现自己只是换了种方式在写 Java 而已。
并且,在具备 Java 语言的知识基础上,这节课的内容也可以帮你快速将已有的经验迁移过来。这样的话,针对相似的语法,你可以直接建立 Kotlin 与 Java 的对应关系,进而加深理解。当然,即使你没有其他编程经验也没关系,从头学即可,Kotlin 的语法足够简洁,也非常适合作为第一门计算机语言来学习。
并且,在具备 Java 语言的知识基础上,这节课的内容也可以帮你快速将已有的经验迁移过来。这样的话,针对相似的语法,你可以直接建立 Kotlin 与 ...
Android发布开源库到JitPack
最近在整合项目资料的时候,注意到项目中很多可以通用的module,每次新建项目都需要把这些module依赖进来,如果module发生了改变,那么所有的项目都需要手动更改代码,因此尝试把通用的组件提取出来,放到JitPack上,当然还有阿里云Maven,和MavenCentral,这个我们下篇在介绍。
创建项目在Android Studio中创建一个名为JitShare的项目
点击Finish完成工程创建。
新建Module与依赖File --> New --> New Module
输入Module name,点击Finish。
创建好module的工程目录结构如下
可以看到app和share是不同的图标,app是可运行模块,share是可依赖模块。
下一步是配置app模块依赖share模块。在开始依赖之前,我们先看appmodule的build.gradle。
下面来添加share模块的依赖.
点击这个图标,或者使用快捷键Ctrl + Alt + Shift + S
在弹框中,按照下图所示操作(Dependencies –> app –> + –&g ...
Fragment-onActivityCreated 废弃解决办法
在新版SDK中,Fragment废弃了onActivityCreated方法,解决办法
在onAttach()方法中,使用lifecycle监听状态
override fun onAttach(context: Context) { super.onAttach(context) Log.e(TAG, "onAttach: ", ) requireActivity().lifecycle.addObserver(object : LifecycleEventObserver { override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { Log.e(TAG, "onStateChanged: " + event.targetState ) if (event.targetState == Life ...
Hilt基本使用
添加依赖项首先,将hilt-android-gradle-plugin添加到项目的根级build.gradle文件中:
buildscript { ... dependencies { ... classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1' }}
然后,应用Gradle插件并在app/build.gradle文件添加依赖:
plugins { ... id 'kotlin-kapt' id 'dagger.hilt.android.plugin' //老版本的gradle方式略有不同 apply plugin:'dagger.hilt.android.plugin'}dependencies { implementation "com.google.dagger:hilt-and ...
iOS动画框架-Spring
框架地址https://github.com/MengTo/Spring
安装方法
Cocoapods: (推荐)
use_frameworks!pod 'Spring', :git => 'https://github.com/MengTo/Spring.git'
手动安装:
将Spring 文件夹拖进Xcode工程,确保勾选了(Copy Item if nedd 和 Create groups)
使用方法
代码:
springView.animation = "shake"springView.animate()
Storyboard
选择View 的类型
可以在Attribute Inspector中设置属性
Android Navigation错误
开发环境:Android Studio: 2020.3.1 Patch 1gradle: 7.0.1navigation 版本: 2.3.5
eg1: 错误详情
API 'BaseVariant.getApplicationIdTextResource' is obsolete and has been replaced with 'VariantProperties.applicationId'.It will be removed in version 7.0 of the Android Gradle plugin.e: /Users/XXX/workspace/Android/demo/NavigationKotlin/app/build/generated/source/navigation-args/debug/com/txh/samples/apps/navigation/LoginFragmentDirections.kt: (12, 16): Class 'ActionLoginFragmentToHomeFra ...
ViewModel和ViewModelProvider
依赖//ViewModelimplementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
创建ViewModelclass GameViewModel : ViewModel() { init { Log.i("GameViewModel", "GameViewModel created!") }}
关联并初始化声明private lateinit var viewModel: GameViewModel
初始化viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
Important: Always use ViewModelProvider to create ViewModel objects rather than directly instantiating an instance of ViewModel ...
Arcgis-Find Places(Swift)
//// ViewController.swift// ArcgissSampleFive//// Created by geowin on 2020/7/15.// Copyright © 2020 geowin. All rights reserved.//import UIKitimport ArcGISclass ViewController: UIViewController ,UIPickerViewDataSource,UIPickerViewDelegate{ func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { Category.all.count } func pi ...