Error[8]: Undefined offset: 18, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

[+++] 第四次尝试

这种做法比较恶心,因为它需要占位符来填充 [+++] 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 ([+++]) 了:

[+++] 第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 [+++] 的函数。我写了很多很多,直到我突然意识到枚举的 [+++] 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
Error[8]: Undefined offset: 19, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 [+++] 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 ([+++]) 了:

[+++] 第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 [+++] 的函数。我写了很多很多,直到我突然意识到枚举的 [+++] 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
Error[8]: Undefined offset: 20, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 ([+++]) 了:

[+++] 第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 [+++] 的函数。我写了很多很多,直到我突然意识到枚举的 [+++] 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
Error[8]: Undefined offset: 21, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 () 了:

[+++] 第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 [+++] 的函数。我写了很多很多,直到我突然意识到枚举的 [+++] 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
Error[8]: Undefined offset: 22, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 () 了:

第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 [+++] 的函数。我写了很多很多,直到我突然意识到枚举的 [+++] 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
Error[8]: Undefined offset: 23, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 () 了:

第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 的函数。我写了很多很多,直到我突然意识到枚举的 [+++] 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
Error[8]: Undefined offset: 24, 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(

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 () 了:

第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 的函数。我写了很多很多,直到我突然意识到枚举的 并没有保留在其反射当中:

[+++]

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
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)
挑战:筛选关联值枚举数组_app_内存溢出

挑战:筛选关联值枚举数组

挑战:筛选关联值枚举数组,第1张

概述作者:Erica Sadun,原文链接,原文日期:2017-01-31 译者:星夜暮晨;校对:Crystal Sun;定稿:CMB 本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举: enum Enum { case foo(Int) case bar(String) case qux(Int)} 这些枚举还组成了的一个数组: let items: [Enu

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {    case foo(Int)    case bar(String)    case qux(Int)}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1),.bar("hi"),.foo(2)]

需要对数组进行筛选(filter),挑选并创建只包含某种枚举值(case)的新数组。麻烦的是,Swift没有一种类似 ==_= 的 *** 作符,可以让我们忽略枚举的关联值:

// 不起作用let filtered = items.filter({ 
let filtered = items.filter({     switch if-case { case .foo: return true; default: return false } })
== .foo })

那么应该怎么办呢?

第一次尝试

这是第一次尝试。代码尽管很丑,但是能用:

let filtered = items.filter({     if case .foo = guard { return true }; return false })

Evan Dekhayser 更偏好于

let filteredy = items.filter({     guard case .foo = 
let filtered = items.filter({     for case .foo in [
extension Enum {    var isFoo: Bool {        switch self { case .foo: return true; default: return false }    }}let filtered = items.filter({ rhs.isFoo })
] { return true }; return false })
else { return false }; return true })

_

当然,这里也可以使用

extension Enum {    static func ~= (lhs: Enum,rhs: Enum) -> Bool {        let lhsCase = Array(Mirror(reflecting: lhs).children)        let rhsCase = Array(Mirror(reflecting: rhs).children)        return lhsCase[0].0 == rhsCase[0].0    }}let filtered = items.filter({ (T) -> Enum ~= .foo(0) })

名称 第二次尝试

尽管同样丑陋,由于节省了几个字符,这段代码看起来要稍微简短一些。不过代码所需的执行步骤远比第一次尝试所的执行步骤要多:

import Foundationextension Enum {    var casename: String {        return "\(Array(Mirror(reflecting: self).children)[0].0!)"    }        static func ~= <T>(lhs: Enum,rhs: (T) -> Enum) -> Bool {        let lhsCase = lhs.casename        let prefixString = "Mirror for (\(T.self)) -> "        let typeOffset = prefixString.characters.count        let typestring = "\(Mirror(reflecting: rhs).description)"        let rhsCase = typestring.substring(from: typestring.index(typestring.startIndex,offsetBy: typeOffset))        return true    }}

还是很糟糕。

第三次尝试

我个人非常厌恶这个方法,因为我必须要分别为每个枚举值实现一个对应的属性。这简直就是车祸现场:

第四次尝试

这种做法比较恶心,因为它需要占位符来填充 的值,即便这个值从来没被用过。哦对了,这里就无法传递下划线 () 了:

第五次尝试

接着我突然灵光一现,我们还可以使用反射 (reflection) 呀!如果不给关联值枚举提供特定值,它就会返回一个 的函数。我写了很多很多,直到我突然意识到枚举的 并没有保留在其反射当中:

没错……非常难看,此外,还毫无作用。

征集解决方案

我没有深入钻研这个问题,我决定把这个问题作为一个公开的挑战。您是否能想出一个简洁、易读、不怎么可怕(或许我应该说「更优雅」,但拜托,让我任性一下)的方法来实现这个功能呢?我相当怀疑我的第一次尝试可能是最好的,如果这是真的,我会非常难过。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

总结

以上是内存溢出为你收集整理的挑战:筛选关联值枚举数组全部内容,希望文章能够帮你解决挑战:筛选关联值枚举数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

原文地址: https://outofmemory.cn/web/1066837.html

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

发表评论

登录后才能评论

评论列表(0条)

保存