草庐IT

ios - Swift - 动态转换类无条件?

coder 2023-09-10 原文

我似乎不能将泛型类型转换为另一个类型? Swift 抛出 DynamicCastClassException。

问题基本上是这样的:

// T is defined as T: NSObject
let oebj1 = NetworkResponse<User>()
let oebj2 = oebj1 as NetworkResponse<NSObject>

这就是我需要进行此转换的原因

class BaseViewController: UIViewController {

   // Not allowed to make a generic viewController and therefore have to cast the generic down to NSObject
   func fetchData(completion: (NetworkResponse<NSObject>)->()) {
      fatalError("You have to implement fetchData method")
   }

}

class UsersViewController: BaseViewController  {
    override func fetchData(completion: (NetworkResponse<NSObject>)->()) {
        userNetworkManager.fetchUsers { networkUSerResponse in
            completion(networkUSerResponse as NetworkResponse<NSObject>)
        }
    }
}

class UserNetworkManager {
   func fetchUsers(completion: (NetworkResponse<User>)->()) {
      // Do stuff
   }
}

最佳答案

一般来说,似乎没有办法做到这一点。基本问题是 NetworkResponse<NSObject>NetworkResponse<User>本质上是完全不相关的类型,但恰好具有相同的功能和相似的命名。

在这种特定情况下,它确实没有必要,因为您要丢弃已知的 User无论如何,这意味着如果你真的想把它当作 User稍后您将不得不进行有条件的回退。只需从 NetworkResponse 中删除通用一切都会按预期工作。主要缺点是在 UserVC.fetchData 内您将无权访问返回的 User没有(条件)转换的结果。

另一种解决方案是分离出 NetworkResponse 中的任何附加信息。从负载类型( User/NSObject )使用某种包装器(假设那里有重要的边带数据)。这样你就可以通过 NetworkResponse super 无损并根据需要向下转换有效负载对象。

像这样:

class User : NSObject {
}

class Transaction {
    let request:NSURLRequest?
    let response:NSURLResponse?
    let data:NSData?
}

class Response<T:NSObject> {
    let transaction:Transaction
    let payload:T

    init(transaction:Transaction, payload:T) {
        self.transaction = transaction
        self.payload = payload
    }
}


class UserNetworkManager {
    func fetchUsers(completion: (Response<User>) -> ()) {
        completion(Response(transaction:Transaction(), payload:User()))
    }
}

let userNetworkManager = UserNetworkManager();

class BaseVC {
    func fetchData(completion: (Response<NSObject>) -> ()) {
        fatalError("Gotta implement fetchData")
    }
}

class UserVC : BaseVC {
    override func fetchData(completion: (Response<NSObject>) -> ()) {
        userNetworkManager.fetchUsers { response -> () in
            completion(Response(transaction: response.transaction, payload: response.payload))
        }
    }
}

尽管此时,您最好将交易信息和有效负载信息分离到单独的回调参数中。

关于ios - Swift - 动态转换类无条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115863/

有关ios - Swift - 动态转换类无条件?的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  7. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐