通用 class 作为参数
Generic class as Parameter
我试图使用泛型来摆脱大量的强制转换。我将提供一个简单的例子:
import UIKit
class List<T> {
let items: [T]
init(items: [T]) {
self.items = items
}
}
class ListsViewController: UIViewController {
var lists: [List<AnyObject>] = []
}
let viewController = ListsViewController()
let lists = [List(items: ["Fruits"])]
viewController.lists = lists
^ error "String" is not identical to "AnyObject"
我读过我可以做到
class ListsViewController<T>: UIViewController
但是我会在必须保存 ListsViewController 实例的链中进一步遇到问题...所以这无济于事。
我在这里没有明白为什么示例使用默认 Swift 数组:
import UIKit
class ListsViewController: UIViewController {
var lists: [AnyObject] = []
}
let viewController = ListsViewController()
let lists = ["Fruits", "Meat"]
viewController.lists = lists
虽然列表的类型是 [String] 而不是 [AnyObject],但没有错误。我的通用 class 也可以得到相同的行为吗?
非常感谢您的提前帮助!
2016 年 8 月 22 日更新: 正如@DeFrenZ 在评论中指出的那样,我的示例依赖于作为引用类型的集合。但是,在 Swift 中,集合是值类型。所以 if 你可以编译我的例子,我认为不会有任何问题。变量 lists
和 lists2
是单独的集合。变异一个不会影响另一个。
原文post 下面继续:
除了我上面的评论和 link 我分享的 http://nomothetis.svbtle.com/type-variance-in-swift(Alexandros Salazar)之外,值得指出的是为什么集合的协方差(没有约束)通常不是类型安全的。
这是一个例子:
var lists: [List<AnyObject>] = []
var lists2: [List<String>] = List(items: ["Fruits"])
lists = lists2 // lists is now an alias for lists2 and is a reference to a list of strings
lists.append(MyObject()) // Now I just put a MyObject into a list of strings
var str:String = lists2[1] // assuming the previous lines compiled and ran ok, this would be a problem because lists2[1] is a MyObject.
(我是靠记忆写这个语法的,在将集合分配给变量时不记得 Swift 的实际语义,但希望这能指出问题。)
我试图使用泛型来摆脱大量的强制转换。我将提供一个简单的例子:
import UIKit
class List<T> {
let items: [T]
init(items: [T]) {
self.items = items
}
}
class ListsViewController: UIViewController {
var lists: [List<AnyObject>] = []
}
let viewController = ListsViewController()
let lists = [List(items: ["Fruits"])]
viewController.lists = lists
^ error "String" is not identical to "AnyObject"
我读过我可以做到
class ListsViewController<T>: UIViewController
但是我会在必须保存 ListsViewController 实例的链中进一步遇到问题...所以这无济于事。
我在这里没有明白为什么示例使用默认 Swift 数组:
import UIKit
class ListsViewController: UIViewController {
var lists: [AnyObject] = []
}
let viewController = ListsViewController()
let lists = ["Fruits", "Meat"]
viewController.lists = lists
虽然列表的类型是 [String] 而不是 [AnyObject],但没有错误。我的通用 class 也可以得到相同的行为吗?
非常感谢您的提前帮助!
2016 年 8 月 22 日更新: 正如@DeFrenZ 在评论中指出的那样,我的示例依赖于作为引用类型的集合。但是,在 Swift 中,集合是值类型。所以 if 你可以编译我的例子,我认为不会有任何问题。变量 lists
和 lists2
是单独的集合。变异一个不会影响另一个。
原文post 下面继续:
除了我上面的评论和 link 我分享的 http://nomothetis.svbtle.com/type-variance-in-swift(Alexandros Salazar)之外,值得指出的是为什么集合的协方差(没有约束)通常不是类型安全的。
这是一个例子:
var lists: [List<AnyObject>] = []
var lists2: [List<String>] = List(items: ["Fruits"])
lists = lists2 // lists is now an alias for lists2 and is a reference to a list of strings
lists.append(MyObject()) // Now I just put a MyObject into a list of strings
var str:String = lists2[1] // assuming the previous lines compiled and ran ok, this would be a problem because lists2[1] is a MyObject.
(我是靠记忆写这个语法的,在将集合分配给变量时不记得 Swift 的实际语义,但希望这能指出问题。)