- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个方法:
public func someMethod<Controller>(controller: Controller) {
print(controller)
typealias HandlerType = Controller -> UIViewController
let handler: HandlerType
print(handler.dynamicType)
}
在用 UIViewController 的子实例调用它之后,在我的例子中是 ViewController,它打印:
<Test.ViewController: 0x7fc43be479d0>
UIViewController -> UIViewController
我的目标是拥有这样的类型别名:
Test.ViewController -> UIViewController
我有 typealias 和声明的 valriable:
public typealias ControllerType = UIViewController
public private(set) static var visibleController: ControllerType?
方法调用是:
if let controller = visibleController {
someMethod(controller)
}
我不明白为什么 ViewController 在 typealias 中变成了 UIViewController,所以如果有人遇到此类问题,和/或有解决方案,请告诉我。
提前谢谢你。
最佳答案
这是因为您的 Controller
的静态类型和动态类型不同。
静态类型取自您的 ControllerType
类型别名,您已将其定义为 UIViewController
。动态类型与 visibleController
指向的实例类型相同 - 在本例中为 Test.ViewController
。
因为泛型是从您传递给函数的静态类型推断出来的(它们的特化发生在编译时),Controller
将被推断为 UIViewController
。因此,您的类型别名将是 UIViewController -> UIViewController
,这就是您的 handler
的 dynamicType
将返回的内容(它似乎回退到静态类型时未分配)。
另一方面,您的 controller
的动态类型确实是 Test.ViewController
,因为这是实例的 dynamicType
你传入。
至于解决方案,在不知道您要在这里实现什么的情况下,很难说。
关于Swift Generic 在 typealias 中被视为父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618110/
没有正确表达式类型的类型别名有什么作用? 在示例中,当另一个类型别名已存在于 BooleanLiteralConvertible 之外时,在 BooleanLiteralConvertible 中创建
作为一项学习练习,我正在尝试编写一个小型函数库。我的库中的许多函数都需要传入函数。我想为该函数“键入别名”,以便我的库的用户必须传入具有特定签名的函数。 我已经试过了: typealias Callb
我想使用 Class1 类中定义的别名。我想将它用于 Class2 import UIKit class Class1: NSObject { typealias tp = () -> Voi
我已经看到这个技巧来实现(比方说)图像类 UIImage/NSImage 的平台无关接口(interface): #if os(iOS) import UIKit typealias
我是 C# 的新手,习惯了 Swift,所以请多多包涵。 我想完全按照以下 Swift 代码描述的方式在 C# 中使用类型: typealias Answer = (title: String, is
在下面的代码中,当我直接引用 C.ID 而不是使用 ID 类型别名时,我得到一个错误,“type of expression is ambiguous without more语境”。如果它们都引用相
我真的只是加入这个社区来寻求解决一个特定问题的帮助,特别是关于如何声明一个以特定顺序保存各种信息类型的类型。对于上下文,我有下面使用的代码示例。 typealias Template = [Strin
嘿,我有一个使用类型别名的代码,这样当用户没有正确注册时,它能够向用户发送错误代码,尽管我的类型别名不起作用,这给我带来了我的类(class)突然出现的问题当我使用类型别名时成为错误类型,有人可以告诉
所以我写了一个与闭包有关的小练习程序。我试图更好地理解异步概念是如何工作的。当我尝试调用 request() 时,出现如下所示的转换错误: import UIKit let correctPassco
好吧,我已经完成了作业并阅读了我能找到的内容,但我似乎无法找到是否可以使用 Swift 来完成。我有一个到处都在使用的枚举:SomeEnum 如果它是 case 则它是一个冗长的 SomeEnum.S
根据Kotlin's lexer的出处, 有一个 typealias 关键字,它不像 yield 和 typeof 那样“保留供将来使用”。 另外,grammar reference建议 typeal
julia> typealias ERROR: UndefVarError: typealias not defined 它在 Julia:0.5 中有效,但在以上版本中无效 help?> typea
为什么编译失败?我试图减少重复的次数,因为在实际代码中类名很大,type 实际上是一个很长的名字 https://godbolt.org/z/8YarWs #include template str
我已经使用Kotlin的typealias定义了E164电话号码类型: typealias E164 = String 这使我在代码中传递电话号码时的意图更加清晰,而不仅仅是传递字符串。我认识到并没有
我的应用程序使用一个由 NSKeyArchiver 创建的文件,它引用了一个包含在外部框架中的对象。应用程序 Xcode 项目中不再提供外部框架。因此,当我尝试加载存档文件时,应用程序会在尝试解析此对
我有一个根对象,它主要由一个元组数组和一堆状态枚举组成。元组是这样描述的: typealias Program = [(Number, Statement)] 根对象目前是 NSCoding,但我想添
我有一个方法: public func someMethod(controller: Controller) { print(controller) typealias Handler
我有一个变量,它必须是 UIView,它也实现了 MTMathKeyboard 协议(protocol)。 我试过了, var keyboard: (UIView & MTMathKeyboard)
我正在处理一个多模块项目,该项目不再编译。设置是一些模块在另一个 git repo(repo“A”)中并将模块的 AAR 输出发布到 maven。然后另一个 git repo (repo "B") 通
我对 Kotlin 中的协议(protocol)组合有点生疏,我只想通过声明自定义 typealias 来组合多个接口(interface): // This doesn't work typeali
我是一名优秀的程序员,十分优秀!