Error[8]: Undefined offset: 29, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

Swift中的泛型数组

有一种方法-做某事-一种。使用协议,有一种方法可以消除类型限制,并且仍然可以得到所需的结果,但这并不总是很漂亮。这是我根据您的情况提出的协议:

protocol MyProtocol {    func getValue() -> Self }extension Int: MyProtocol {    func getValue() -> Int {        return self    }}extension Double: MyProtocol {    func getValue() -> Double {        return self    }}

请注意,

value
您最初放在协议声明中的属性已更改为返回对象的方法。

那不是很有趣。

但是现在,由于您已经摆脱

value
了协议中的属性,因此
MyProtocol
可以将其用作类型,而不仅仅是类型约束。您的
Container
班级甚至都不再需要泛型。您可以这样声明:

class Container {    var values: [MyProtocol]    init(_ values: MyProtocol...) {        self.values = values    }    func myMethod() -> [MyProtocol] {        return values    }}

而且由于

Container
不再通用,因此您可以创建一个
Array
Container
然后遍历它们,打印
myMethod()
方法的结果:

var containers = [Container]()containers.append(Container(1, 4, 6, 2, 6))containers.append(Container(1.2, 3.5))for container in containers {    println(container.myMethod())}//  Output: [1, 4, 6, 2, 6]//          [1.2, 3.5]

诀窍是构造 仅包含通用功能且对符合类型没有其他要求 的协议 如果您可以避免这样做,那么可以将协议用作类型,而不仅仅是类型约束。

另外(如果您想这样称呼),您的

MyProtocol
值数组甚至可以混合符合的不同类型
MyProtocol
。因此,如果您给出这样
String
MyProtocol
扩展名:

extension String: MyProtocol {    func getValue() -> String {        return self    }}

您实际上可以

Container
使用混合类型初始化a :

let container = Container(1, 4.2, "no kidding, this works")

[警告-我正在一个在线游乐场进行测试。我还不能在Xpre中对其进行测试…]

编辑:

如果你仍然想

Container
成为通用的,只能容纳一个类型的对象,就可以完成,通过使 符合自己的协议:

protocol ContainerProtocol {    func myMethod() -> [MyProtocol]}class Container<T: MyProtocol>: ContainerProtocol {    var values: [T] = []    init(_ values: T...) {        self.values = values    }    func myMethod() -> [MyProtocol] {        return values.map { 仍然 as MyProtocol }    }}

现在,您

[ContainerProtocol]
可以拥有一个
myMethod()
对象数组,并通过调用它们进行迭代
let containers: [ContainerProtocol] = [Container(5, 3, 7), Container(1.2, 4,5)]for container in containers {    println(container.myMethod())}

Container

也许这仍然对您不起作用,但是现在

ContainterProtocol
仅限于一种类型,但是您仍然可以遍历[+++]对象数组。



)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Swift中的泛型数组_随笔_内存溢出

Swift中的泛型数组

Swift中的泛型数组,第1张

Swift中的泛型数组

有一种方法-做某事-一种。使用协议,有一种方法可以消除类型限制,并且仍然可以得到所需的结果,但这并不总是很漂亮。这是我根据您的情况提出的协议:

protocol MyProtocol {    func getValue() -> Self }extension Int: MyProtocol {    func getValue() -> Int {        return self    }}extension Double: MyProtocol {    func getValue() -> Double {        return self    }}

请注意,

value
您最初放在协议声明中的属性已更改为返回对象的方法。

那不是很有趣。

但是现在,由于您已经摆脱

value
了协议中的属性,因此
MyProtocol
可以将其用作类型,而不仅仅是类型约束。您的
Container
班级甚至都不再需要泛型。您可以这样声明:

class Container {    var values: [MyProtocol]    init(_ values: MyProtocol...) {        self.values = values    }    func myMethod() -> [MyProtocol] {        return values    }}

而且由于

Container
不再通用,因此您可以创建一个
Array
Container
然后遍历它们,打印
myMethod()
方法的结果:

var containers = [Container]()containers.append(Container(1, 4, 6, 2, 6))containers.append(Container(1.2, 3.5))for container in containers {    println(container.myMethod())}//  Output: [1, 4, 6, 2, 6]//          [1.2, 3.5]

诀窍是构造 仅包含通用功能且对符合类型没有其他要求 的协议 如果您可以避免这样做,那么可以将协议用作类型,而不仅仅是类型约束。

另外(如果您想这样称呼),您的

MyProtocol
值数组甚至可以混合符合的不同类型
MyProtocol
。因此,如果您给出这样
String
MyProtocol
扩展名:

extension String: MyProtocol {    func getValue() -> String {        return self    }}

您实际上可以

Container
使用混合类型初始化a :

let container = Container(1, 4.2, "no kidding, this works")

[警告-我正在一个在线游乐场进行测试。我还不能在Xpre中对其进行测试…]

编辑:

如果你仍然想

Container
成为通用的,只能容纳一个类型的对象,就可以完成,通过使 符合自己的协议:

protocol ContainerProtocol {    func myMethod() -> [MyProtocol]}class Container<T: MyProtocol>: ContainerProtocol {    var values: [T] = []    init(_ values: T...) {        self.values = values    }    func myMethod() -> [MyProtocol] {        return values.map { 仍然 as MyProtocol }    }}

现在,您

[ContainerProtocol]
可以拥有一个
myMethod()
对象数组,并通过调用它们进行迭代
let containers: [ContainerProtocol] = [Container(5, 3, 7), Container(1.2, 4,5)]for container in containers {    println(container.myMethod())}

Container

也许这仍然对您不起作用,但是现在

ContainterProtocol
仅限于一种类型,但是您仍然可以遍历对象数组。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5642266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存