如何用kotlin开发同时支持iOS和Android的库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用kotlin开发同时支持iOS和Android的库相关的知识,希望对你有一定的参考价值。
参考技术A 虽说kotlin-native可以支持链接到c,java,objective-c等语言,甚至可以进行原生开发,但是在使用的过程中并不友好,配置繁琐且api相对生硬。那么,我们能用kotlin做些什么来减少开发成本呢? 通过kotlin构建库不失为一个好办法,可以将ios和安卓共有的参数、model和通用方法用kotlin写成库,并分别打包给两个平台使用,在未来应该是一个可行性的方案。由于现在kotlin-native还是没有推出正式版,不建议马上通过这种方式来开发项目,这里只是给未来的开发提供了一种可能性。
下面就介绍一下怎么用kotlin来开发一个支持两个平台的库:
一、在idea中打开 File -> New -> Project
二、在侧边栏选择gradle并取消勾选java
三、设置项目的GroupId、artifactId、 Version信息
四、选择gradle环境,如果选择本地的配置,可以省去配置的时间
五、配置项目名称和存放的路径,并Finish
在根目录新建一个名为src的文件夹,并在里面按照java开发的方式添加package:com.leacode.model
新建名为base.kt文件
修改build.gradle
然后用命令行进入项目的目录下并执行
就会在项目根目录的 build/libs文件夹下生成名为 leacode.kotlin-1.0-SNAPSHOT.jar
可以用于导入安卓项目使用
修改build.gradle
然后执行
就会在build/konan/bin/iphone目录下生成一个名为Base.framework的文件
可以用于导入ios项目中使用
如何用值初始化 Kotlin 中的数组?
【中文标题】如何用值初始化 Kotlin 中的数组?【英文标题】:How to initialize an array in Kotlin with values? 【发布时间】:2015-09-30 16:56:16 【问题描述】:在Java中可以初始化一个数组,例如:
int numbers[] = new int[] 10, 20, 30, 40, 50
Kotlin 的数组初始化是什么样子的?
【问题讨论】:
也许看看文档:kotlinlang.org/docs/reference/basic-types.html 文档在某种程度上隐藏了答案。他们没有给出源代码示例,而是在旁注中提到了(不推荐使用的)array()
函数: 要创建一个数组,我们可以使用库函数 array() 并将项目值传递给它,这样数组(1, 2, 3) 创建一个数组 [1, 2, 3]。
虽然我喜欢 Kotlin,但我说“Kotlin 文档”还不够好(我从其他网站学到了比 kotlinlang.org 更多的东西)。
有时您只需要一个 intRange,您可以这样做:val numbers = 1..5
它给出了一个从 1 到 5 的 int 范围。
【参考方案1】:
在下面初始化字符串检查时
val strings = arrayOf("January", "February", "March")
我们可以使用其专用的 arrayOf 方法轻松地初始化一个原始 int 数组:
val integers = intArrayOf(1, 2, 3, 4)
【讨论】:
【参考方案2】:对于二维数组:
val rows = 3
val cols = 3
val value = 0
val array = Array(rows) Array<Int>(cols) value
您可以将元素类型更改为您想要的任何类型(字符串、类...),并将值更改为相应的默认值。
【讨论】:
【参考方案3】:这是一个简单的例子
val id_1: Int = 1
val ids: IntArray = intArrayOf(id_1)
【讨论】:
【参考方案4】:Kotlin 语言有专门的类来表示原始类型的数组而没有装箱开销:例如 - IntArray
、ShortArray
、ByteArray
等。我需要说的是,这些类与父 @ 没有继承关系987654324@ 类,但它们具有相同的方法和属性集。它们中的每一个也都有相应的工厂函数。因此,要在 Kotlin 中使用值初始化数组,您只需输入以下内容:
val myArr: IntArray = intArrayOf(10, 20, 30, 40, 50)
...或者这样:
val myArr = Array<Int>(5, i -> ((i+1) * 10) )
myArr.forEach println(it) // 10, 20, 30, 40, 50
现在你可以使用它了:
myArr[0] = (myArr[1] + myArr[2]) - myArr[3]
【讨论】:
【参考方案5】:val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)
详情请见Kotlin - Basic Types。
你也可以提供一个初始化函数作为第二个参数:
val numbers = IntArray(5) 10 * (it + 1)
// [10, 20, 30, 40, 50]
【讨论】:
使用intArrayOf
是否优于arrayOf
?那么IntArray
比Array<Int>
有优势吗?
@LarsBlumberg IntArray 等于 int[],ArraylistOf(10, 20, 30, 40, 50)
当我使用 intArrayOf() 函数时,我面对的是Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage
。我正在使用jdk1.8.0_241
和 Intellij IDEA【参考方案6】:
我的回答补充了@maroun 这些是初始化数组的一些方法:
使用数组
val numbers = arrayOf(1,2,3,4,5)
使用严格的数组
val numbers = intArrayOf(1,2,3,4,5)
混合类型的矩阵
val numbers = arrayOf(1,2,3.0,4f)
嵌套数组
val numbersInitials = intArrayOf(1,2,3,4,5)
val numbers = arrayOf(numbersInitials, arrayOf(6,7,8,9,10))
能够从动态代码开始
val numbers = Array(5) it*2
【讨论】:
【参考方案7】:简单的方法:
对于整数:
var number = arrayOf
保留所有数据类型
var number = arrayOf(10 , "字符串值" , 10.5)
【讨论】:
【参考方案8】:在 Kotlin 中有几种方法。
var arr = IntArray(size) // construct with only size
然后只需从用户或其他集合或您想要的任何地方获取初始值。
var arr = IntArray(size)0 // construct with size and fill array with 0
var arr = IntArray(size)it // construct with size and fill with its index
我们也可以使用内置函数创建数组-
var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values
另一种方式
var arr = Array(size)0 // it will create an integer array
var arr = Array<String>(size)"$it" // this will create array with "0", "1", "2" and so on.
您也可以使用doubleArrayOf()
或DoubleArray()
或任何原始类型来代替Int。
【讨论】:
var arr = IntArray(size, it * 1 )
与var arr = IntArray(size)it
相同【参考方案9】:
这样就可以在koltin中初始化int数组了。
val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。【参考方案10】:在Java中可以初始化一个数组,例如:
int numbers[] = new int[] 10, 20, 30, 40, 50
但在 Kotlin 中,数组初始化有多种方式,例如:
您可以使用任何通用类型的数组 arrayOf() 函数:
val arr = arrayOf(10, 20, 30, 40, 50)
val genericArray = arrayOf(10, "Stack", 30.00, 40, "Fifty")
使用 Kotlin 的实用函数可以初始化数组
val intArray = intArrayOf(10, 20, 30, 40, 50)
【讨论】:
【参考方案11】:值得一提的是,当使用 kotlin 内置函数(例如 intArrayOf()
、longArrayOf()
、arrayOf()
等)时,您无法使用给定大小的默认值(或所有值)初始化数组,相反,您需要根据类构造函数通过调用进行初始化。
// Array of integers of a size of N
val arr = IntArray(N)
// Array of integers of a size of N initialized with a default value of 2
val arr = IntArray(N) i -> 2
【讨论】:
使用 lambda 的第二个默认值 init 非常有帮助!谢谢 第二种初始化形式可以写成:IntArray(N) i -> 2
甚至(用常量初始化时)IntArray(N) 2
我们可以使用 "_" var arr = IntArray(N) _ -> false 代替 i
带有 lambda 的那个正是我初始化具有动态大小和非可选默认值的数组所需要的。谢谢!【参考方案12】:
我想知道为什么没有人给出最简单的答案:
val array: Array<Int> = [1, 2, 3]
根据我原始答案的其中一个 cmets,我意识到这仅在用于注释参数时才有效(这对我来说真的出乎意料)。
看起来 Kotlin 不允许在注释之外创建数组字面量。
例如,使用 args4j 库中的 @Option 查看这段代码:
@选项( 名称=“-h”, 别名 = ["--help", "-?"], 用法 = "显示此帮助" ) var帮助:布尔=假选项参数“别名”的类型为Array<String>
【讨论】:
这段代码出现以下错误:Unsupported [Collection literals outside annotations] 我以前没见过这个。这种语法对 Kotlin 来说是新的吗? @LarsBlumberg,可能,我最近才开始在 IntelliJ 2019.1 中使用 Kotlin,我初始化了一个字符串数组,就像我展示的那样,它工作了 @RémiP,好点,我在注释参数上使用了它。但这意味着数组字面量在某些情况下有效,而在另一些情况下则无效? @hdkrus 为什么不更新答案以显示数组初始化如何与注释一起使用?这对于本问题的许多读者来说可能很有价值。【参考方案13】:在 Kotlin 中,我们可以使用 arrayOf()
、intArrayOf()
、charArrayOf()
、booleanArrayOf()
、longArrayOf()
函数创建数组。
例如:
var Arr1 = arrayOf(1,10,4,6,15)
var Arr2 = arrayOf<Int>(1,10,4,6,15)
var Arr3 = arrayOf<String>("Surat","Mumbai","Rajkot")
var Arr4 = arrayOf(1,10,4, "Ajay","Prakesh")
var Arr5: IntArray = intArrayOf(5,10,15,20)
【讨论】:
请重新格式化此答案,以便清楚什么是代码和什么是注释。 仅供阅读此答案的任何人使用...使用arrayOf作为基元的优化不如说intArrayOf。此外,arrayOf 创建对象,而 inArrayOf 保留原语【参考方案14】:您可以简单地使用现有的标准库methods,如下所示:
val numbers = intArrayOf(10, 20, 30, 40, 50)
虽然使用特殊的构造函数可能是有意义的:
val numbers2 = IntArray(5) (it + 1) * 10
您传递一个大小和一个描述如何初始化值的 lambda。这是文档:
/**
* Creates a new array of the specified [size], where each element is calculated by calling the specified
* [init] function. The [init] function returns an array element given its index.
*/
public inline constructor(size: Int, init: (Int) -> Int)
【讨论】:
【参考方案15】:在全局声明 int 数组
var numbers= intArrayOf()
下一个 onCreate 方法用值初始化你的数组
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//create your int array here
numbers= intArrayOf(10,20,30,40,50)
【讨论】:
虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。【参考方案16】:你可以像这样创建一个 Int 数组:
val numbers = IntArray(5, 10 * (it + 1) )
5 是 Int 数组大小。 lambda 函数是元素初始化函数。 'it' 范围在 [0,4] 中,加上 1 个在 [1,5] 中的范围
原点函数是:
/**
* An array of ints. When targeting the JVM, instances of this class are
* represented as `int[]`.
* @constructor Creates a new array of the specified [size], with all elements
* initialized to zero.
*/
public class IntArray(size: Int)
/**
* Creates a new array of the specified [size], where each element is
* calculated by calling the specified
* [init] function. The [init] function returns an array element given
* its index.
*/
public inline constructor(size: Int, init: (Int) -> Int)
...
Arrays.kt 中定义的 IntArray 类
【讨论】:
【参考方案17】:以这种方式初始化数组:val paramValueList : Array<String?> = arrayOfNulls<String>(5)
【讨论】:
【参考方案18】:你可以试试这个:
var a = Array<Int>(5)0
【讨论】:
【参考方案19】:在我的情况下,我需要初始化我的抽屉项目。我用下面的代码填充数据。
val iconsArr : IntArray = resources.getIntArray(R.array.navigation_drawer_items_icon)
val names : Array<String> = resources.getStringArray(R.array.navigation_drawer_items_name)
// Use lambda function to add data in my custom model class i.e. DrawerItem
val drawerItems = Array<DrawerItem>(iconsArr.size, init =
index -> DrawerItem(iconsArr[index], names[index]))
Log.d(LOGGER_TAG, "Number of items in drawer is: "+ drawerItems.size)
自定义模型类-
class DrawerItem(var icon: Int, var name: String)
【讨论】:
这并没有真正以明智的方式回答问题。 请查看我使用 lambda 函数添加项目的评论。 这似乎仍然是解决此问题的一种复杂方法,至少与其他答案相比。我也看了我之前的消息,回想起来似乎很苛刻 - 对不起。 没关系,没问题。我只是试图以解决我的问题的方式回答,我没有与其他答案进行比较。谢谢!【参考方案20】:我认为值得一提但文档不够直观的是,当您使用工厂函数创建一个数组并指定它的大小时,该数组的初始化值等于它们的值指数值。例如,在这样的数组中:
val array = Array(5, i -> i )
,分配的初始值是[0,1,2,3,4]
,而不是[0,0,0,0,0]
。这就是为什么从文档中,val asc = Array(5, i -> (i * i).toString() )
产生["0", "1", "4", "9", "16"]
的答案
【讨论】:
【参考方案21】:老问题,但如果您想使用范围:
var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()
产生几乎相同的结果:
var numbers = Array(5, i -> i*10 + 10 )
结果:10、20、30、40、50
我认为第一个选项更具可读性。两者都有效。
【讨论】:
【参考方案22】:你可以使用这个方法
var numbers=Array<Int>(size,init)
var numbers=IntArray(size,init)
var numbers= intArrayOf(1,2,3)
例子
var numbers = Array<Int>(5, i -> 0 )
init代表默认值(初始化)
【讨论】:
如果您在Array<Int>()
和IntArray()
中提供init
的示例,这会有所帮助,您的回答目前还没有太大帮助。
答案已修改
Array这是一个例子:
fun main(args: Array<String>)
val arr = arrayOf(1, 2, 3);
for (item in arr)
println(item);
您还可以使用playground 来测试语言功能。
【讨论】:
一条注释,要打印数组的值,我们可以使用 array.joinToString(" ") 来代替循环。 工作,但看起来更像是用 Kotlin 编写的 Java,而不是惯用的 Kotlin :)以上是关于如何用kotlin开发同时支持iOS和Android的库的主要内容,如果未能解决你的问题,请参考以下文章
来了!支持 iOS 开发的 Kotlin/Native v0.4 发布
Kotlin 一统天下?Kotlin/Native 开始支持 iOS 和 Web 开发