{
"title": "灵瓜背单词 Beta 新鲜出炉",
"tags": [
"post",
"LinguaTale",
"iOS",
"SwiftUI",
"English",
"Learning"
],
"sources": [
"xlog"
],
"external_urls": [
"https://xlog.mekal.xyz/linguatale-beta-release"
],
"date_published": "2023-03-30T16:44:28.989Z",
"content": "肝了一个月,这个基于 GPT 模型的背单词 App 终于发布 Beta 版本了。作为一个程序员,每次整出一个产品出来的时候总是异常兴奋,就像是孕育了 10 个月的宝宝马上就要出生了。\n\n## 限量派送 100 位终身 VIP\n\n先打个广告,放个下载链接,欢迎尝鲜提反馈,我后面会为前 100 名参与 Beta 版测试的同学送上终身会员!\nhttps://testflight.apple.com/join/8d8ei614\n![linguatale_appicon-3](ipfs://bafybeidjr5ywsvhnzt7htcssaflxdipejflxz3oeztrmjvkfi45f6m6kui)\n\n## 关于灵瓜\n这个产品的灵感来自于我自己学英语背单词的需求。我使用了市面上的很多背单词的 App,包括百词斩、扇贝、墨墨背单词、这些用户量很大的,也包括一些相对小众或者个人开发者开发的,比如方块背单词,List 单词,词根词缀背单词等等。背完两本雅思词书之后发现还是有很多问题:\n1. 每天干巴巴的背单词实在是太枯燥了\n2. 很多单词是在 App 背单词的场景认识,一到实际语境中就觉得很模糊了\n3. 单纯背单词基本只是能保证遇到单词能认识,但是自己很难在实际口语或者写作中去应用\n4. 背完单词只能记住一个基础意思,实际遇到单词的其他形态就又不认识了\n\n带着以上的这些问题和困惑,突然有一天,我得到一个灵感,即将背单词与读故事进行结合,这样我们就可以在实际的语境中反复的接触那些我们需要背的单词,毕竟看小说比干巴巴背单词有意思多了。相比传统背单词的方法,我觉得灵瓜背单词会有以下优点:\n1. 边读故事边背单词没那么枯燥了,可能不知不觉就看了很久的故事,然后发现居然掌握了很多单词\n2. 一个单词会反复在多个章节出现,无形中强化记忆,而且可能是不同的上下文或不同的形态\n3. 故事是根据自己的背单词进度生成的,对每个人来说都是私人定制\n\n于是,一个月后的今天,「灵瓜背单词」闪亮登场!\n\n## 关于开发体验\n作为一名程序员,最近这半年的开发已经对 ChatGPT 以及其他各种 AI 工具产生了严重的依赖,特别是最近这一个月。\n上面的图片是这个 App 的 Icon,这是我用 Midjourney 制作的。\n另外目前 App 内置的[四个故事模版](https://mekal.xlog.app/4-Story-templates)的 Cover 图片也都是用 Midjourney 生成的。值得一提的是,用 Midjourney 生成文章的头图、插图之类的,基本就是一次成型,成功率接近 100%。\n对于 iOS 开发,我就是个接触才半年的门外汉,只会 SwiftUI。不过对于老油条程序员来说,虽然没有那么多时间研究底层的原理,但因为有了 AI 的加持,捣鼓出一些自己想要的东西还是挺容易的。我已经从「面向 StackOverflow 编程」成功跨越到了「面向 ChatGPT 编程」。\n对于很多技术问题,ChatGPT 能够直接给出可以运行的代码,如果出错了,直接贴上错误日志,他还能帮你一起分析错误原因。\n举个简单例子,我在最后收尾阶段想在「关于」页面底部显示 App 的版本号,然后:\n\n> **我**:在 iOS App 中如何获取并显示当前 App 的版本以及 Build 信息?\n\n> **ChatGPT**: 在 iOS 应用开发中,你可以通过访问应用的 Info.plist 文件来获取当前应用的版本号和构建号,然后将其显示在应用界面上。\n> \n> 以下是在 Swift 中获取并显示应用版本和构建信息的示例代码:\n> ```swift\n> if let infoDict = Bundle.main.infoDictionary {\n> // 获取应用版本号\n> if let appVersion = infoDict[\"CFBundleShortVersionString\"] as? String {\n> print(\"App Version: \\(appVersion)\")\n> }\n> \n> // 获取应用构建号\n> if let buildNumber = infoDict[\"CFBundleVersion\"] as? String {\n> print(\"Build Number: \\(buildNumber)\")\n> }\n> }\n> ```\n> 你可以将上面的代码添加到应用程序的启动代码中,例如在 AppDelegate 的 didFinishLaunchingWithOptions 方法中。> 如果你想在应用界面中显示版本和构建信息,可以将这些值分别赋给文本标签或标签的文本属性。\n> \n> 例如,在一个 UIViewController 中,你可以使用以下代码将版本和构建信息显示在两个标签中:\n> ```swift\n> if let infoDict = Bundle.main.infoDictionary {\n> // 获取应用版本号\n> if let appVersion = infoDict[\"CFBundleShortVersionString\"] as? String {\n> versionLabel.text = \"Version: \\(appVersion)\"\n> }\n>\n> // 获取应用构建号\n> if let buildNumber = infoDict[\"CFBundleVersion\"] as? String {\n> buildLabel.text = \"Build: \\(buildNumber)\"\n> }\n> }\n> ```\n> 请确保将 versionLabel 和 buildLabel 与您应用界面中的标签控件进行连接。\n\n> **我**: SwiftUI 中呢?\n\n> **ChatGPT**: 在 SwiftUI 中,你可以通过使用 Bundle 和 Text 视图来获取并显示应用程序的版本号和构建号。下面是获> 取并显示应用程序版本号和构建号的 SwiftUI 代码示例:\n> ```swift\n> import SwiftUI\n>\n> struct ContentView: View {\n> var body: some View {\n> VStack {\n> if let appVersion = Bundle.main.infoDictionary?[\"CFBundleShortVersionString\"] as? String {\n> Text(\"App Version: \\(appVersion)\")\n> }\n> if let buildNumber = Bundle.main.infoDictionary?[\"CFBundleVersion\"] as? String {\n> Text(\"Build Number: \\(buildNumber)\")\n> }\n> }\n> }\n> }\n> ```\n> 在上述示例中,我们首先检查 Bundle.main.infoDictionary 是否存在,然后分别从中获取应用程序的版本号和构建号。如> 果成功获取,则使用 Text 视图将它们显示在垂直堆栈中。\n> \n> 你可以将上面的代码复制到你的 SwiftUI 视图中,以便在你的应用程序中显示应用程序版本号和构建号。\n\n你看,直接给我最终的代码,我只需要 Copy/Paste 即可。",
"attributes": [
{
"value": "linguatale-beta-release",
"trait_type": "xlog_slug"
}
]
}