我有一个方法:
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/
我已更新到Rails2.3.10、Rack1.2.1,现在我的所有即时消息都没有显示。我发现在重定向期间,通知是这样传递的redirect_to(@user,:notice=>"Sorrytherewasanerror")在我看来闪存哈希是空的!map:ActionController::Flash::FlashHash{}但是您可以在Controller中看到该消息。是什么原因?session{:home_zip=>"94108",:session_id=>"xxx",:flash=>{:notice=>"Sorrytherewasanerror"},:user_credential
我想检查是否正在Rails的before_save回调中创建模型。我还想检查它是否已被修改(更新时)。谢谢 最佳答案 您可以使用new_record?看看你是否有一个全新的对象和changed?查看是否有任何变化:before_save:pancakesdefpancakesifnew_record?#Notinthedatabaseyet.elsifchanged?#Alreadyexistsbutithasunsavedchanges.endend 关于ruby-on-rails-检
我在Twitter上找到了以下代码片段(查看帖子历史以获取来源)。[5]pry(main)>Date.parse('3Dogs')ArgumentError:invaliddate[6]pry(main)>Date.parse('23Dogs')=>Mon,23Nov2015这只是一个偷偷摸摸的彩蛋吗?如果是这样,为什么这个特定的日期和结果?如果不是彩蛋,为什么23Dogs解析为日期,但3Dogs不解析? 最佳答案 这与Pry无关。如果您检查Date::parse的文档你会看到,“如果可选的第二个参数[comp]为真[默认值]并且检
根据Reek,创建类变量被认为是“代码味道”。这背后的解释是什么? 最佳答案 您可以在他们关于ClassVariables的文档中找到:Classvariablesformpartoftheglobalruntimestate,andassuchmakeiteasyforonepartofthesystemtoaccidentallyorinadvertentlydependonanotherpartofthesystem.Sothesystembecomesmorepronetoproblemswherechangingsomet
我在OSX上使用irb,当我按左/右选项(或META+B/F)时,光标移动到下一个/上一个单词。但irb不会将点(.)字符视为单词分隔符。我尝试将(.)添加到.irbrc,所以现在看起来像这样:Readline.basic_word_break_characters="\t\n`>但这没有任何效果。我使用的是普通的MountainLionruby和手动编译的1.9.3,这两个版本的irb行为相似。此外,点在bash和pry中被视为分隔符,因此系统范围的设置可能没问题。感谢任何帮助,谢谢 最佳答案 好吧,问题似乎出在我的系统中根本
以下问题与问题“RubyPrintInjectDoSyntax”有关。我的问题是,我们能否坚持使用do和end并使其与puts或p一起使用?这个有效:a=[1,2,3,4]b=a.injectdo|sum,x|sum+xendputsb#printsout10所以,这样说对吗,inject是Array对象的一个实例方法,这个实例方法接受一段代码,然后返回一个数字。如果是这样,那么它应该与调用函数或方法并取回返回值没有区别:b=foo(3)putsb或b=circle.getRadius()putsb以上两种情况,我们可以直接说putsfoo(3)putscircle.getRadi
当用户不是管理员并且它工作正常时,我有以下代码来禁用text_field:但是当用户是管理员时,text_field就会消失。有谁知道为什么会这样以及我必须做什么? 最佳答案 假设is_admin?返回true或false,您可以简单地做目前,if条件,即ifnotis_admin?应用于整个文本字段,这导致is_admin?时文本字段消失。code>返回true,当条件返回false时显示文本字段。 关于ruby-on-rails-text_field在RubyonRails中被禁用,
我正在读取一个政府文本文件,其中$用作分隔符,但我认为分隔符不重要...所以这是预期的:'a$b$c$d'.split('$')#=>["a","b","c","d"]在我正在处理的数据文件中,列标题行(第一行)被统一填充,即没有空标题,如:'a$b$$d'#or:'a$b$c$'但是,每行可能有连续的尾随分隔符,例如:"w$x$$\r\n"通常,我会阅读每一行并咀嚼。但这会导致String#split将最后两个定界符视为一列:"w$x$$\r\n".chomp.split('$')#=>["w","x"]不做chomp得到我想要的结果,虽然我应该chomp最后一个元素:"w$x$$\
我有这样的关系:Parenthas_many:childrenChildbelongs_to:parent我想做的是如果没有更多的child离开,删除parent。所以要做到这一点,我有:Childbefore_destroy:destroy_orphaned_parentdefdestroy_orphaned_parentparent.children.eachdo|c|returnifc!=selfendparent.destroyend这很好用,但是我也想将父级的删除级联到子级。例如。我通常会这样做:Parenthas_many:children,:dependent=>:des
在我的测试中,我使用一些参数初始化了一个名为Package的新类。在这个类的初始化中,我打开了一个文件,该文件在我的远程机器上可用,但在本地通常不存在。我想知道如何在我的测试中stub该方法。我正在使用rspec和mocha。我试过类似的东西:File.stubs(:open).with(:file).returns(File.open("#{package_root}/test_files/test.yml"))在我的测试中初始化Package之前,我有这一行。我遇到了这个错误:unexpectedinvocation:File.open('package/test_files/te