使用枚举在结构中设置基于案例的变量的更有效方法

Posted

技术标签:

【中文标题】使用枚举在结构中设置基于案例的变量的更有效方法【英文标题】:More efficient way of setting case-based variables in struct using enum 【发布时间】:2020-11-05 05:29:19 【问题描述】:

我目前正在尝试重建我的一个较小的早期项目,即网络浏览器。我尝试实现的一项功能是漂亮的 URL 和搜索词。这意味着,在 TextField 中输入搜索查询或可加载 URL 后,它不会显示完整的 URL,而是使其成为可读(或 漂亮)的搜索词/URL。

现在,我有一个名为 Live 的结构体,它包含 3 个变量:searchTermprettyURLfullURL。当用户加载搜索词时,TextField 会显示searchTerm。当用户加载一个 URL 时,TextField 将显示prettyURL,直到用户输入一个新地址——在这种情况下,TextField 将更改为fullURL(类似于 ios Safari)。

一个非常简单的概念,但我的最终目标是拥有一个函数,该函数通过名为LiveType 的枚举以最有效的方式设置相关类型。现在,我觉得我想要的功能的代码行数太多了。

我的目标是这样的:Live.set(query, forType: .searchTerm)。这就是我现在拥有的:

Live.swift

struct Live 
    
    static var searchTerm = ""      // ie. "hello world"
    static var prettyURL = ""       // ie. "google.com"
    static var fullURL = ""         // ie. https://google.com/...
    
    // BAD FUNCTION: Doesn't make use of LiveType.setLive
    static func set(_ query: String, forType: LiveType) 
        switch forType 
        case .search: searchTerm = query
        case .pretty: prettyURL = query
        case .full: fullURL = query
        
    
    


enum LiveType 
    
    case search
    case pretty
    case full
    
    var setLive: String 
        switch self 
        case .search: return Live.searchTerm
        case .pretty: return Live.prettyURL
        case .full:   return Live.fullURL
        
    
    

理想情况下,我想要更紧凑的东西。像这样的:

static func set(_ query: String, forType: LiveType) 
    forType.setLive = query

但是,我无法让它工作。有人能解释一下吗?此外,如果我将其做得比需要的更长和更复杂,我对替代方法持开放态度。也许我不需要枚举或结构,太好了!我很想知道这可能会改善我的编程风格。这对我来说纯粹是一次学习体验!

谢谢!

【问题讨论】:

您想要识别用户输入的功能吗?例如,如果用户写 google.com,prettyURL 变量是否等于 google.com? 我不清楚您要做什么。 setLive 函数应该做什么(现在,它是一个吸气剂,所以它没有设置任何东西)。 Live.set 应该做什么?是否根据正确的LiveType 参数设置属性?为什么不直接设置属性?但大多数情况下,当你说“最有效”——最少的代码行时,你并不清楚你想要优化什么?这并不总是最好的。 【参考方案1】:

据我了解,您不需要 struct Live 来为 enum LiveType 存储 query String。您可以在 enum LiveType 中简单地使用 associated values,即

enum LiveType 
    case search(String)
    case pretty(String)
    case full(String)

现在,您可以像这样创建 LiveType 实例,

let liveType = LiveType.search("hello world")

【讨论】:

以上是关于使用枚举在结构中设置基于案例的变量的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中设置枚举的最简洁方法是啥? [复制]

如何在 Netbeans 中设置环境变量?

通过字符串变量在Python中设置和获取@property方法

使用 Apache 时在 PHP 中设置用于访问的环境变量

在PHP中设置环境变量仅对一个用户有效,而对另一个用户无效

无法在异步方法中设置 useState 变量并控制台记录它