当前位置: 首页 > news >正文

Kotlin学习(二)

2.kotlin学习(二)

1.条件控制

package com.simon.secondfun main(args: Array<String>) {//ifvar a = 1var b = 2var max:Intif (a > b){max = a}else{max = b}//作为表达式结果赋值给max1 感觉这个简单啊var max1 = if(a>b)a else bprintln(max)println(max1)//同样可以和区间一起var x = 6if( x in 1..6) println("x在区间里面")//when when类似于其他语言的switchwhen(x){1,3 -> println("x==1 or x==3")2 -> println("x==2")//区间也可以in 4..5 -> println("4<=x<=5")//可以类型判断也基本上就是判断式都okis Int -> println("x是数字")else ->{println("x是其他数字")}}//还能判断集合中是否存在var items = setOf<String>("apple","banana")when{"banana" in items -> println("banana in items")"apple" in items -> println("apple in items")}}

if和java差不多

when类似于switch

2.循环控制

package com.simon.secondfun main(args: Array<String>) {//for循环可以对任何提供迭代器对象来便利//for(item in collection)print(item)val ints:Array<Int> = arrayOf(1,2,3)for (item in ints){print(item)}//如果想通过索引来读(会编译优化,也可以选择下面这个方式)for(i in ints.indices){print(ints[i])}println()for((index,item) in ints.withIndex()){print("$index:$item ")}//while 和 doWhile循环
//    while (布尔表达式){
//        //内容
//    }
//    do{
//        //内容
//    }while (布尔表达式)var x = 5while (x>0){println(x--)}var y = 5do {println(y--)}while (y > 0)test1()foo()
}
fun test():Int{//return break 和 continuefor (i in 1..10){if (i == 3)continueprintln(i)if (i>5)break}return 10
}//Break和Continue标签
//这个爽炸了,直接跳指定循环舒服了
//continue同理跳到指定循环
fun test1(){loop@ for(i in 1..100){loop1@for (j in 1..100){if (i == j) {println("i==j")break@loop}}}
}
//标签处返回
//举个例子
fun foo(){var ints:Array<Int> = arrayOf(1,2,3)//如果没有标签处返回就会返回整个函数的返回,如果是有标签就会是标签处返回ints.forEach lit@{if (it == 3) return@litprintln(it)}//lambda表达式使用隐式标签ints.forEach {if (it == 2) return@forEachprint(it)}//匿名函数var x = ints.forEach(fun(value:Int){if (value == 2) return@forEachprint(value)})}

标签蛮有意思的可以多看看

感觉kotlin的lambda还是有点看不懂啊

3.类和对象

package com.simon.secondimport kotlin.properties.Delegatesclass Empty {}
class Runoob {//类的属性var name:String = "simon"var url:String = "www.baidu.com"var city:String = "赣州"//创建对象val site = Runoob()//成员函数fun foo(){println("foo is use")//调用属性println(site.city)println(site.name)println(site.url)}
}
//kotlin里面可以有一个主构造器以及一个或者多个此构造器,主构造器是类头部的一部分
class Person constructor(firstName:String){}
//如果主钩早期没有任何注解或者可见度修饰符那么可以省略构造器关键词
class Person1(firstName: String){}
//定义了一个Person2类,包含两个可变变量,lastName和no,lastName而修改了getter,no修改了setter
class Person2{var lastName:String = "zhang"get() = field.toUpperCase() //将变量赋值后转化为大写setvar no:Int = 100get() = fieldset(value){field = if (value<10) value else -1}//不可见var heiht:Float = 145.4fprivate set//backing filed 后备变量//例如下面一种情况
//    var name:String = "HelloWorld"
//        get() = namevar name:String = ""get() = fieldset(value){field = value}//另外还有一个非空属性的延迟加载}fun main(args: Array<String>) {var ps = Person2()println(ps.lastName)ps.no = 10println(ps.no)
//    ps.heiht = 10.2f//报错set是privateprintln(ps.heiht)//后备变量/** 我造!怎么溢出了??* println(ps.name)* 梳理下逻辑* 我ps.name调用name属性的get方法获取值,发现还是name属性,那继续get,自然就溢出了* set同理* 那这样我们就在外部如何访问修改他的值呢???* 这个时候后备变量就起作用了!* 也就是我们的变量的值就是filed的值* 我们属性使用会自动地调用set get方法* 但是这下就不会了* */ps.name = "Hello kotlin"println(ps.name)
}package com.simon.second
//1.延时加载 lateinit
class MyTest {//我们的lateinit是用于延时加载我们的非基本类型的变量lateinit var myVar:String//我们的基本数据类型想要被延时加载可以像下面这样用var myInt:Int? = null//也就是允许为null且赋值为nullfun checkMyVar(){if (::myVar.isInitialized){println(myVar)}else{println("未被初始化")}}}
//2.我们的主构造器没有其他构造器那样有一个程序段所以我们可以在构造的时候使用init关键字
class Person3 constructor(firstName: String) {var name:String = firstNamevar age:Int?=nullinit {println("FirstName is $firstName")}//次构造器,我们就需要加前缀constructor//并且我们的次构造器需要先去代理主构造函数,同一个类里面代理主构造函数就使用this关键字constructor (name: String, age:Int) : this(name) {this.age = age}
}
//3.我们定义了一个类之后会默认有无参构造,如果想要隐藏构造器可以这样操作(私有化)
class DontCreateMe private constructor () {
}//4.抽象类
abstract class Derived  {abstract fun f()
}//5.嵌套类
class Outer {                  // 外部类private val bar: Int = 1class Nested {var str:String = "simon"// 嵌套类fun foo() = 2}//那么我们的嵌套类与我们的内部类有什么区别呢?
}
//6.内部类
class Outer1{private val bar:Int = 2//内部类inner class Nested1{var str:String = "innerSimon"fun getBar():Int{return this@Outer1.bar}}
}
//7.匿名内部类
interface TestInterFace{fun test()
}
class Test{var v = "成员属性"fun setInterFace(test: TestInterFace){//我们可以看到我们的这个参数是这个接口test.test()}
}//8.类的修饰符
/*** 属性修饰符* abstract 抽象类* final 类不可继承* enum 枚举类* open 类可继承 默认类是final的* annotation 注解类* 访问修饰符* private 一个文件可以*protected 同一个文件或者子类可见* public 所有调用的地方都可以见* internal 同一个模块中可见** */fun main(args: Array<String>) {var myTest = MyTest()myTest.checkMyVar()myTest.myVar = "hello kotlin"myTest.checkMyVar()var person = Person3("simon")var person2 = Person3("simon2",5)println(person2.name)println(person2.age)//嵌套类var nest = Outer.Nested()println(nest.foo())//外部和内部元素均无法互相访问//内部类//我们内部类的对象在获取时也要初始化我们的外部类对象//(可能用到外部类的属性所以也要获取实例)//外部无法访问内部但是内部可以访问外部var bar = Outer1().Nested1().getBar()//我们外部对象访问不了内部的str属性
//    var str = Outer1().strprintln(bar)//匿名内部类/** 采用对象表达式来创建接口对象,即匿名内部类的实例* */var test = Test()test.setInterFace(object : TestInterFace{override fun test() {println("对象表达式创建匿名内部类的实例")}})
}

主要注意:

延时加载、主次构造器(次无论如何都会走主代理)、后备变量、init、嵌套类和内部类

4.继承

我们要知道我们Kotlin中所有类都继承Any类(类似java的Object)

Any提供了三个函数

equals hashCode toString

注:Any不是java.lang.Object

package com.simon.secondimport javax.naming.Context//基本的继承演示
open class Base(p:Int)
class BaseDerived(p:Int):Base(p){}//1.如果子类有主构造函数,则基本必须在主构造函数中立刻初始化
open class Person5(var name:String,var age:Int){//要声明出来可以被重写open fun study(){println("我毕业了")}
}class Student(name: String,age: Int,var no:String,var score:Int):Person5(name,age){}
//个人理解就是:如果基类主构造函数有这两个字段,那么我们的子类在声明时也必须吧这个字段带入自己的主构造函数//2.如果子类没有主构造函数
//class Student1():Person5(name = "simon",12){
//
//}
//就像上面上的必须马上初始化就直接赋值给基类的主构造函数
//或者像下面在次构造里面写一个super基类的构造方法
class Student2: Person5{//也就是我只有这个有参构造,构造的同时调用父类的主构造方法constructor(name: String,age: Int):super(name,age){}//3.重写方法override fun study() {println("我还在读书")}
}
//4.重写属性(一般用不上了解就行)
interface Foo{val count:Int
}
//将一个val属性重写为var(常-》变)
//不能变量变成常量
class Bar1(override var count:Int):Foo
//将属性重写属性和值
class Bar2 : Foo {override var count: Int = 1
}fun main(args: Array<String>) {var s = Student("Runoob",18,"s123",89)println("${s.name}")println("${s.age}")println("${s.no}")println("${s.score}")//重写var s2 = Student2("simon",19)s2.study()}

5.接口

Kotlin中的接口与java8类似,允许方法有默认实现

package com.simon.secondimport javax.naming.Context//基本的继承演示
open class Base(p:Int)
class BaseDerived(p:Int):Base(p){}//1.如果子类有主构造函数,则基本必须在主构造函数中立刻初始化
open class Person5(var name:String,var age:Int){//要声明出来可以被重写open fun study(){println("我毕业了")}
}class Student(name: String,age: Int,var no:String,var score:Int):Person5(name,age){}
//个人理解就是:如果基类主构造函数有这两个字段,那么我们的子类在声明时也必须吧这个字段带入自己的主构造函数//2.如果子类没有主构造函数
//class Student1():Person5(name = "simon",12){
//
//}
//就像上面上的必须马上初始化就直接赋值给基类的主构造函数
//或者像下面在次构造里面写一个super基类的构造方法
class Student2: Person5{//也就是我只有这个有参构造,构造的同时调用父类的主构造方法constructor(name: String,age: Int):super(name,age){}//3.重写方法override fun study() {println("我还在读书")}
}
//4.重写属性(一般用不上了解就行)
interface Foo{val count:Int
}
//将一个val属性重写为var(常-》变)
//不能变量变成常量
class Bar1(override var count:Int):Foo
//将属性重写属性和值
class Bar2 : Foo {override var count: Int = 1
}fun main(args: Array<String>) {var s = Student("Runoob",18,"s123",89)println("${s.name}")println("${s.age}")println("${s.no}")println("${s.score}")//重写var s2 = Student2("simon",19)s2.study()}

6.扩展

package com.simon.secondclass User(var name:String)
//1.扩展函数
fun User.Print(){println("用户名:${name}")
}
//2.扩展函数swap
fun MutableList<Int>.swap(index1:Int,index2:Int){var tmp = this[index1]this[index1] = this[index2]this[index2] = tmp
}
//3.扩展函数是静态解析的(具体是哪个对象调用就是哪个对象的扩展函数)和动态绑定正好不一样
open class D
class E: D()
fun C.foo() = "C"fun D.foo() = "D"
fun printFoo(d: D){println(d.foo())
}
//4.还可以扩展一个空对象,使用Any那不是所有类的toString都会判空了?
fun Any?.toString():String{if (this == null)return "null"return toString()
}
//5.伴生对象的扩展(方法和属性)
class MyClass{companion object{}
}fun MyClass.Companion.foo(){println("伴生对象的方法扩展")
}val MyClass.Companion.id: Intget() = 1
//6.作用域也可以扩展,懒得分包了不掩饰了//7.扩展声明为成员
class F{fun bar(){println("F bar")}fun G.foo(){barG()bar()}fun caller(g:G){g.foo()}}
class G{fun barG(){println("G bar")}
}fun main(args: Array<String>) {var user = User("simon")user.Print()var l = mutableListOf(1,2,3)l.swap(0,2)println(l.toString())//虽然传的是D对象,但是接受的是C对象,所以调用的是C的foo,所以为静态的printFoo(E())println(MyClass.foo())println(MyClass.id)var g = G()var f = F()f.caller(g)}

8.数据类和密封类

package com.simon.secondimport kotlin.math.exp//1.数据类 只包含数据的类data class UserInfo(val name:String, val age:Int)
//equals,hashCode,toString,componentN,copy
//上面四个不说了演示下copy
//标准库提供了pair和triple但是实际上数据类设计更加完善//2.密封类(这个蛮有意思的,同样是对有限类型的限制,举个例子)
//我们内嵌的子类定义了两个状态,一个是关闭一个是开启
//那么我们配合when对我们的这个op按钮类型进行判断
sealed class UiOp {object Show: UiOp()object Hide: UiOp()class TranslateX(val px: Float): UiOp()class TranslateY(val px: Float): UiOp()
}
fun execute(view: View, op: UiOp) = when (op) {UiOp.Show -> view.visibility = View.VISIBLEUiOp.Hide -> view.visibility = View.GONEis UiOp.TranslateX -> view.translationX = op.px // 这个 when 语句分支不仅告诉 view 要水平移动,还告诉 view 需要移动多少距离,这是枚举等 Java 传统思想不容易实现的is UiOp.TranslateY -> view.translationY = op.px
}class View {companion object{const val VISIBLE = trueconst val GONE = false}var translationY: Float = 0.0fvar translationX: Float = 0.0fvar visibility:Boolean = true
}fun main(args: Array<String>) {val cp1 = UserInfo("simon",13);val cp2 = cp1.copy(name = "simon1",14)println(cp1.toString()+cp2.toString())//解构val (name,age) = cp2//
}

感觉密封类和枚举类似但是密封类可以携带数据

相关文章:

Kotlin学习(二)

2.kotlin学习&#xff08;二&#xff09; 1.条件控制 package com.simon.secondfun main(args: Array<String>) {//ifvar a 1var b 2var max:Intif (a > b){max a}else{max b}//作为表达式结果赋值给max1 感觉这个简单啊var max1 if(a>b)a else bprintln(ma…...

LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型

根据图片生成推广文案&#xff0c; 用的HuggingFace中的image-caption模型 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数…...

QFontDialog开发详解

QFontDialog 类是 Qt 框架中用于选择字体的对话框类。它允许用户选择字体的各种属性,如字体名称、字号、粗体、斜体等。以下是 QFontDialog 的一些常见用法和详解: 一、QFontDialog基本用法 #include <QApplication> #include <QFontDialog> #include <QMes…...

【C++进阶之路】第七篇:异常

文章目录 一、C语言传统的处理错误的方式二、 C异常概念三、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范 四、自定义异常体系五、C标准库的异常体系&#xff08;了解&#xff09;六、异常的优缺点 一、C语言传统的处理错误的方式 传统的错误处理机制&am…...

shell 判断文件是否存在(csh bash)

文章目录 前言1. -e 判断文件是否存在2. -f 判断文件是否存在且为普通文件3. -d 判断文件是否存在且为目录3. -s 判断文件是否存在且不为空4. -r 判断文件是否存在且可读5. -w 判断文件是否存在且可写6. -x 判断文件是否存在且可执行 前言 Shell 编程能提升我们工作效率&#…...

第六年到第十年是分水岭

我今年懈怠了&#xff0c;觉得就这样了&#xff0c;看到知乎上有个大神的帖子&#xff0c;深受触动&#xff0c;前五年都差不多&#xff0c;第六年到第十年才是分水岭&#xff0c;是否愿意继续努力&#xff0c;才是关键。拷贝如下&#xff1a; 作者&#xff1a;技术王 来源&…...

关于标准库中的string类 - c++

目录 关于string类 string类的常用接口 string类常用接口的简单模拟实现 关于string类 string类在cplusplus.com的文档介绍 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。 3. string在…...

Chrome添加扩展程序

Crx4Chrome 下载crx 打开扩展程序 如果拖动crx文件到扩展程序提示只能通过Chrome应用商店添加此项内容 修改crx文件后缀为zip并解压&#xff0c;再拖动到扩展程序 Vue.js devtools...

C++单调向量算法:132模式枚举1简洁版

本题不同解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&#xff1a;132 模式解法二枚举2代码简洁C二分查找算法&#xff1a;132 模式解法三枚举1性能最佳C单调向量算法&#xff1a;132 模式解法三枚举1代码更简洁C二分查找算法&#xff1a;1…...

【ARFoundation学习笔记】2D图像检测跟踪

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏&#xff0c;更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 2D图像检测创建一个图像检测工程图像追踪的禁用和启用多图像追踪…...

计算机算法分析与设计(24)---分支限界章节复习

文章目录 一、分支界限法介绍二、旅行商问题应用三、装载问题应用3.1 问题介绍与分析3.2 例题 四、0-1背包问题应用4.1 问题介绍与分析4.2 例题 一、分支界限法介绍 二、旅行商问题应用 三、装载问题应用 3.1 问题介绍与分析 3.2 例题 四、0-1背包问题应用 4.1 问题介绍与分析…...

二十三种设计模式-解密状态模式:优雅地管理对象状态

在软件开发中&#xff0c;经常会遇到需要根据对象的状态来改变其行为的情况。传统的实现方式可能涉及到大量的条件语句或者使用标志位来跟踪状态&#xff0c;导致代码复杂、难以维护。 而状态模式&#xff08;State Pattern&#xff09;可以提供一种优雅且灵活的解决方案&#…...

git常常用命令

这篇文章中&#xff0c;一些简单的&#xff0c;大家都知道的git 命令我就不再赘述&#xff0c;我只写出来最近在项目中常用到的一些命令。这些命令可以帮助我更好的开发。 git stash 请大家设想下面的场景&#xff0c;你的本地有两个分支&#xff0c;develop,fix分支&#xf…...

C语言中的大端字节序和小端字节序是什么?如何进行字节序的转换?

C语言中的大端字节序和小端字节序以及字节序的转换 引言 在计算机科学中&#xff0c;字节序是指多字节数据在存储或传输过程中字节的排列顺序。在C语言中&#xff0c;特别是在涉及二进制数据的处理、网络通信以及硬件相关的编程中&#xff0c;了解大端字节序和小端字节序的概…...

Flutter dio Http请求之Cookie管理

在应用开发过程中&#xff0c;我们进行Http通讯时会使用Cookie进行验证&#xff0c;今天我们就着重讲解Flutter 网络请求插件dio的cookie使用。 首先&#xff0c;我们要进行插件引用 # HTTP 请求 dio: ^5.1.1 cookie_jar: ^4.0.8 dio_cookie_manager: ^3.0.0# 获取沙盒路径 p…...

计算机网络的标准化工作及相关组织

一、国际化组织 计算机网络的标准化工作由一些主要的组织来进行管理和推动。以下是几个主要的计算机网络标准化的国际组织及其相关的标准&#xff1a; 1. 国际标准化组织&#xff08;ISO&#xff09;&#xff1a;国际标准化组织负责制定各种行业的标准&#xff0c;包括计算机…...

智能座舱架构与芯片- (11) 软件篇 上

一、智能汽车基础软件平台分类 汽车软件主要分为应用软件和基础软件。应用软件和业务形态高度关联&#xff0c;不同控制器的应用软件之间差异较大。基础软件介于应用软件和硬件之间&#xff0c;用于屏蔽硬件特性、支撑应用软件。可有效地实现应用软件与硬件之间解耦&#xff0…...

2021秋招-算法-递归

算法-递归 教程: ⭐告别递归&#xff0c;谈谈我的一些经验 LeetCode刷题总结-递归篇 基础框架 leetcode刷题 1.leetcode-101. 对称二叉树-简单 101. 对称二叉树 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。…...

【Django-02】 Model模型和模型描述对象Meta

Model和Meta 概念ModelMetaModel支持的字段类型Meta 属性例子 概念 就是对象的意思&#xff0c;底层一个Model对应一张表&#xff0c;而Meta是Model的内部类&#xff0c;是用来描述Model和数据库表的相关元数据信息&#xff0c;比如主键&#xff0c;排序&#xff0c;unique_ke…...

【华为OD题库-030】阿里巴巴找黄金宝箱(V)-java

题目 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面贴有一个数字.阿里巴巴念出一个咒语数字k(k<N),找出连续k个宝箱数字和的最大值&#xff0c;并输出该最大值。 输入描述 第…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...