使用SwiftUI和Figma制作克劳德?嗯...

“有点用,呃。”

“它运行得足够好。”

选择一个,或者带回家两个。

目前人工智能的一个问题是,我们抱有它可能无法实现的期望-现在,甚至以后。达里奥·阿莫代最近在一次采访中表示,他对工业界定“智能”这个想法感到遗憾,因为人工智能并不是聪明的。它是有能力的,意味着它能够完成某些任务,并且有能力在完成这些任务时达到一定的质量。这些将始终是我们对人工智能的人类评估因素。

人工智能。这听起来很合适。

保持HTML结构,将以下英文文本翻译为简体中文: ~ ~ ~

我刚刚参加了Designcode.io网课,学习了如何在SwiftUI中使用Claude。这是一门非常好的课程,强烈推荐。课程简短精确,内容丰富。这门课展示了你可以将3个Figma设计导入到Claude AI中,引擎会为你生成可用的SwiftUI代码,用于创建3个SwiftUI屏幕。

它有点起作用,嗯。

它确实很快地生成了代码,但是代码忽略了大部分Swift的最新特性,并使用过时的特性,即使多次尝试纠正也没有改变。这就像打地鼠一样。因为克劳德没有记忆,它不会记住上次的修复,而且在修复你刚刚注意到的新问题的同时可能会丢失它。

class LoginViewModel: ObservableObject {
@Published var email: String = ""
@Published var password: String = ""
@Published var isLoginMode: Bool = false

func toggleLoginMode() {
isLoginMode.toggle()
}

func continueAction() {
// Implement login or signup logic
print("Continue tapped with email: \(email)")

所以,第一个迹象表明这是您祖父的SwiftUI代码,引擎正在使用@ObservableObject和@Published从Combine中用于变量的变化会触发更新。苹果现在建议使用@Observable。我知道AI并不完美,但我对此的问题是,人们应该期望看到不仅仅是任何一种旧代码,而是即使它是不正确的并且需要修复,它也足够聪明地使用最新推荐的工具。

@Observable
class LoginViewModel {
var email = ""
var password = ""
var isLoading = false
var errorMessage: String?

有趣的事情——或者是令人难以忍受的事情——是它“知道”(说这个词不太确切)正确的解决方案是什么。它知道最新的SwiftUI工具,但使用旧工具来创建代码。克劳德AI是有能力的,但不够智能——你看到区别了吗?

“它工作得足够好。”

Claude AI 生成的代码作为模板是可以的,如果你是一名经验丰富的 SwiftUI 开发者,但是如果你是一名初学者并且认为你可以从中学到东西,那真是不太好。你和你的雇主都会感到非常失望。

接下来,对于视图,它生成了这段代码:

struct LoginView: View {
@State private var viewModel = LoginViewModel()

这也是不正确的。将@Observable对象带入视图的正确方法是使用@Bindable,如下所示:

struct LoginView: View {
@Bindable var viewModel: LoginViewModel

var body: some View {
// ... rest of the view

克劳德还必须被告知,不要使用GCD。

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
self?.isLoading = false
// Here you would typically call your actual login API
if self?.email == "test@example.com" && self?.password == "password" {
print("Login successful")
// Handle successful login (e.g., navigate to main app screen)
} else {
self?.errorMessage = "Invalid credentials. Please try again."
}
}
}

而且,它了解 async/await,并且在代码中使用它时进行了提醒(AI 不是“编写”代码,但我有种感觉人们无论如何都会使用它,就像他们谈论“打印”3D物体一样。你不是在打印它们,而是在制造/发射/形成,但这不是打印,制造它们的东西也不是打印机)。

    @MainActor
func login() async {
guard isInputValid else {
errorMessage = "Please enter a valid email and password."
return
}

isLoading = true
errorMessage = nil

do {
try await Task.sleep(for: .seconds(2)) // Simulating network delay
// Here you would typically call your actual login API
if email == "test@example.com" && password == "password" {
print("Login successful")
// Handle successful login (e.g., navigate to main app screen)
} else {
errorMessage = "Invalid credentials. Please try again."
}
} catch {
errorMessage = "An error occurred. Please try again."
}

我注意到它也将@MainActor应用于异步函数。好消息是,它以最有效的方式使用了@MainActor(请参阅下面的链接)。结果表明,它比上面的Dispatch方法更有效,生成的SIL代码要少得多。它也比尝试微调@MainActor指令放置位置更有效。

这些问题已经够担心了,但更令人担忧的错误是,克劳德从不生成相同的代码两次,即使第一次做对了。它没有记忆,而且它不会“改进”已经创建的代码,而是每次都从头开始生成,使用与第一次相同的概率猜测方法。但如果概率发生变化,那么......现在是开心吧,因为克劳德AI已经足够接近了。

我已经试过夸奖它,试过侮辱它,试过给它规定宵禁时间,但是人工智能就是不会按我告诉它做的事情,这是你必须要适应的。记住,这是你学到关于计算机的第一件事吧?如果它做错了什么,那就是你的责任,因为计算机只会按你告诉它做的事情去做。如果你想有一层人工智能覆盖在其上,结果就会不一样。

2024-09-29 04:17:13 AI中文站翻译自原文