如何使用自定义setter声明属性,但在Kotlin中没有getter?例如,在Anko中,他们这样做:
var myProperty: Type
@Deprecated(AnkoInternals.NO_GETTER, level = DeprecationLevel.ERROR)
get() = AnkoInternals.noGetter()
set(value) { field = value; /* setter logic */ }
Run Code Online (Sandbox Code Playgroud)
但它对我来说看起来有些笨拙.这是一种正确的方法吗?如果是,那么当项目没有Anko依赖时呢?
PS让我明确一点 - 我想完全没有吸气剂,而不是私人吸气剂
我正在尝试在 kotlin 中获取 facebook-app 的哈希密钥,然后再使用此 java 方法获取我的应用程序的 hask 密钥:
Java代码:
// Add code to print out the key hash
try {
PackageInfo info = getPackageManager().getPackageInfo(
"your.package",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试将此代码片段转换为 kotlin 代码:
科特林代码:
try {
val info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
for (signature in info.signatures) {
val md = MessageDigest.getInstance("SHA")
md.update(signature.toByteArray())
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT))
}
} catch …Run Code Online (Sandbox Code Playgroud) 假设我有一个更高阶的函数,它注册了某种点击监听器.我可以记录它的用途和listener传入的参数,如下所示:
/**
* Adds a [listener] that's called when the item is clicked.
*
* @param listener The listener to add
*/
fun addClickListener(listener: (count: Int) -> Unit) {
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法记录参数listener?这将是count在这个例子中.在我的实际用例中,我的监听器中有多个参数.
我注意到的是[listener]文本可以在我正在使用此功能的文档视图中单击,但它只显示一个关于它的空对话框.有没有办法以某种方式描述参数?
现在,我最终@param在addClickListener方法中用块来描述侦听器的参数,但这会在IDE中产生警告,我想知道是否有更合适的方法来执行此操作.
我一起使用Kotlin和MVP,偶然发现了一点烦恼.
我收到了"意外覆盖"错误(从下面可以看出).除了在MainView界面中更改成员变量名称或getX()之外,是否有任何解决方案.
根据我的研究,没有办法阻止kotlin为'x'生成吸气剂.
class MainActivity : Activity(), MainView {
val x: String // Accidental override
override fun getX(): String {
return x
}
}
interface MainView {
fun getX(): String
}
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用扩展函数来延迟运行任何方法,但似乎无法搞清楚.
我尝试下面的东西,我有一个函数,我想要一个处理程序延迟执行一定的timeInterval:
functionX().withDelay(500)
functionY().withDelay(500)
private fun Unit.withDelay(delay: Int) {
Handler().postDelayed( {this} , delay)}
private fun Handler.postDelayed(function: () -> Any, delay: Int) {
this.postDelayed(function, delay)}
Run Code Online (Sandbox Code Playgroud)
任何人?
如果我使用var charSet = 1..10它,但当我使用下面的代码时,我收到此错误.
var charSet = "A".."Z"
for (value in charSet) {
println("$value")
}
Run Code Online (Sandbox Code Playgroud)
For循环范围必须具有'iterator()'方法.
请让我知道如何解决这个问题.
我是 Android Studio 的 kotlin 新手。我在 kotlin 中编写了一个函数,它接受 Arraylist 作为输入并随机对其进行洗牌 -
fun randomize(array: ArrayList<Any>) { ... }
Run Code Online (Sandbox Code Playgroud)
我希望这个函数接受任何类型的 ArrayList,但使用以下参数调用会出现类型不匹配错误 -
val arr = ArrayList<Int>()
// ...
randomize(array = arr) // Gives Error
Run Code Online (Sandbox Code Playgroud)
我如何使用接受任何类型的ArrayList。感谢您的帮助。
下面的功能创建一个地图,获取乘客数量> minTrips的乘客数量.代码完全正常.请看下面
fun List<Trip>.filter(minTrips : Int): Set<Passenger> {
var passengerMap: HashMap<Passenger, Int> = HashMap()
this.forEach { it: Trip ->
it.passengers.forEach { it: Passenger ->
var count: Int? = passengerMap.get(it)
if (count == null) {
count = 1
passengerMap.put(it, count)
} else {
count += 1
passengerMap.put(it, count)
}
}
}
val filteredMinTrips: Map<Passenger, Int> = passengerMap.filterValues { it >= minTrips }
println (" Filter Results = ${filteredMinTrips}")
return filteredMinTrips.keys
}
Run Code Online (Sandbox Code Playgroud)
虽然这是用Kotlin编写的,但似乎代码最初是用Java编写的,然后转换为Kotlin.如果它真的是用Kotlin写的,我相信这不会是这么多行代码.如何减少代码行?解决这个问题的更有趣的方法是什么?我可以使用哪些功能或功能直接提取乘客设置> minTrips?这是一个太多的代码,似乎很疯狂.任何指针在这里都会有所帮助.
我编写了以下示例并检查了对象a和b的observerA变量的值.
例
class Test {
val observerA = Observer<String>{}
}
Run Code Online (Sandbox Code Playgroud)
校验
val a = Test()
val b = Test()
AppLogger.LOGE("[A]ObserverA: ${a.observerA} [B]ObserverA: ${b.observerA}")
Run Code Online (Sandbox Code Playgroud)
结果
[A]ObserverA: com.test.Test$observerA$1@e3d8a1b
[B]ObserverA: com.test.Test$observerA$1@e3d8a1b
Run Code Online (Sandbox Code Playgroud)
我的猜测是a.observerA和a.observerA应该是不同的,但它们引用相同的对象.
当我在下面编写observerA时,我看到创建了不同的对象.我不知道为什么会出现这种差异.
val observerA = object : Observer<String>{
override fun onChanged(t: String?) {
}
}
Run Code Online (Sandbox Code Playgroud) 我只是编程的初学者,今天开始学习Kotlin.我收到了这个错误.
fun main(args: Array<String>) {
val (two, three) = nextTwo(1) // Unresolved reference: nextTwo
println("1, $two, $three")
fun nextTwo(num: Int) : Pair<Int, Int> {
return Pair(num+1, num+10)
}
}
Run Code Online (Sandbox Code Playgroud)
如果变量是int,是否可以在kotlin中设置getter以返回int的双重insted?
没有宣布新的功能.
var x = 0
get() = x.toDouble()
Run Code Online (Sandbox Code Playgroud)