使用枚举在结构中设置基于案例的变量的更有效方法
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 个变量:searchTerm
、prettyURL
和 fullURL
。当用户加载搜索词时,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")
【讨论】:
以上是关于使用枚举在结构中设置基于案例的变量的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章