Swift 到 Kotlin - 扩展
Swift to Kotlin - Extensions
我正在尝试创建自定义变量 (fooModel) 作为 Android 'Activity' class 的扩展。在 Swift 中,这只是作为 'UIViewController' 的 class 扩展完成的,创建变量然后随时访问它。
这是在 Swift 中有效的扩展:
extension UIViewController {
var fooModel : barFooModel? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.fooModel) as? barFooModel
}
set(value) {
objc_setAssociatedObject(self, &AssociatedKeys.fooModel, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
在 Kotlin 中,我做了以下事情:
var Activity.fooModel: barFooModel?
get() = fooModel as barFooModel
set(value) {
fooModel = value
}
这将引发以下错误:
Unresolved reference: fooModel
一个自动生成的解决方案是导入'fooModel',但这似乎不正确,仍然没有解决错误。
注意:我能够通过遵循 'Activity' class 的变量访问此变量扩展名(请参阅下面的示例),这看起来像应该可以,我只是遗漏了一些东西:
fun <T: Activity, M: BarFooModel> newInstance(context: Context, activityType: T, _fooModel: M): T {
val intent = Intent(context, activityType::class.java) as T
**intent.fooModel = _fooModel** // intent.fooModel IS accessible, based on the extension created.
return intent
}
我走在正确的轨道上吗?我可以做些什么来匹配 'fooModel' 变量扩展的 Swift 实现?
提前致谢。
如果我没理解错的话,应该是这样的:
object AssociatedKeys {
const val fooModel = "fooModel"
}
open class BarFooModel : Serializable
var Intent.fooModel: BarFooModel?
get() {
return getSerializableExtra(AssociatedKeys.fooModel) as BarFooModel?
}
set(value) {
putExtra(AssociatedKeys.fooModel, value)
}
fun <T : Activity, M : BarFooModel> newInstance(context: Context, activityType: T, _fooModel: M): Intent {
val intent = Intent(context, activityType::class.java)
intent.fooModel = _fooModel
return intent
}
Intent 可用于存储Associated Objects
我正在尝试创建自定义变量 (fooModel) 作为 Android 'Activity' class 的扩展。在 Swift 中,这只是作为 'UIViewController' 的 class 扩展完成的,创建变量然后随时访问它。
这是在 Swift 中有效的扩展:
extension UIViewController {
var fooModel : barFooModel? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.fooModel) as? barFooModel
}
set(value) {
objc_setAssociatedObject(self, &AssociatedKeys.fooModel, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
在 Kotlin 中,我做了以下事情:
var Activity.fooModel: barFooModel?
get() = fooModel as barFooModel
set(value) {
fooModel = value
}
这将引发以下错误:
Unresolved reference: fooModel
一个自动生成的解决方案是导入'fooModel',但这似乎不正确,仍然没有解决错误。
注意:我能够通过遵循 'Activity' class 的变量访问此变量扩展名(请参阅下面的示例),这看起来像应该可以,我只是遗漏了一些东西:
fun <T: Activity, M: BarFooModel> newInstance(context: Context, activityType: T, _fooModel: M): T {
val intent = Intent(context, activityType::class.java) as T
**intent.fooModel = _fooModel** // intent.fooModel IS accessible, based on the extension created.
return intent
}
我走在正确的轨道上吗?我可以做些什么来匹配 'fooModel' 变量扩展的 Swift 实现?
提前致谢。
如果我没理解错的话,应该是这样的:
object AssociatedKeys {
const val fooModel = "fooModel"
}
open class BarFooModel : Serializable
var Intent.fooModel: BarFooModel?
get() {
return getSerializableExtra(AssociatedKeys.fooModel) as BarFooModel?
}
set(value) {
putExtra(AssociatedKeys.fooModel, value)
}
fun <T : Activity, M : BarFooModel> newInstance(context: Context, activityType: T, _fooModel: M): Intent {
val intent = Intent(context, activityType::class.java)
intent.fooModel = _fooModel
return intent
}
Intent 可用于存储Associated Objects