我要学习SwiftUI还是UIKit?自WWDC 2019以来,全球各地的新iOS程序员一直在问一个问题。我应该从哪一个开始?我会同时学习吗?几乎普遍而言,我阅读的大多数回复都说UIKit。他们说SwiftUI还没有准备好,没人在使用它。不。我不同意,虽然不是出于您可能正在考虑的原因。

功能、范例、安装是编程的三个基础知识,除了学习编码的基础知识之外,还包括变量,语句,循环,方法。另外,学习编程的重要任务还应该包括是编写可维护的代码。他人可以轻松阅读和理解的代码。

让我告诉您更多信息-第一个线索在于令人沮丧的新闻发布,这是一个名为SwiftLint的应用程序。强制执行某种样式和/或约定的工具。命名约定,间距约定,编码约定。使您的代码外观和感觉与您的同行编写的代码相同的约定。在某些情况下,约定实际上会使您构建更好的代码。它检查的一些标准不仅涉及语法和样式,还有一些也是良好的编码实践。

从不纵容我们的SwiftUI

推出几个月后,很多朋友都开始学习SwiftUI工具包。最初会觉得有点烦。,因为它不会让我们继续练习一些坏习惯。

import SwiftUI
struct SwiftUIView: View {
  var body: some View {
    Text("Hello, World!")
  }
}

那里没事。我们的下一个动作是添加第二个标签。 SwiftUI将立即失败并报告错误。





uikit和swiftui uikit和swiftui区别_文本框


image.png


现在,如果您使用UIKit进行此操作,您将已经编写了类似的内容。您可以在其中轻松添加第二个无错误标签的示例。那么第一个问题是什么,您可能会问哪里有更好的编码实践?

class ViewController: UIViewController {
override func viewDidLoad() {
  super.viewDidLoad()
  let myLabel = UILabel(frame: CGRect(x: 100, y: 100, width: 100,   height: 100))
  myLabel.text = "Hello World"
  view.addSubview(myLabel)
  }
}

好吧,如果您花30秒钟以上的时间使用SwiftUI,您将知道第一个问题的答案。这是错误的,因为您需要一个VStack。 VStack是SwiftUI添加约束的方式,最终您始终需要在应用程序界面中约束。但是,在UIKit中它不会抱怨,因为您不需要约束,除非您构建一个真正的应用程序。具有讽刺意味的是,UIKit可以让您构建半个应用程序,而SwiftUI则不会。

您甚至没有意识到,SwiftUI迫使您从一开始就立即开始做出正确的决定。它迫使您做出更好的编码决策。
让我们继续。您在SwiftUI中构建菜单。您放入VStack并添加标签,文本框和图像,然后很快就达到了十个元素,这使您停滞不前。弹出另一个错误,提示:通话中有其他参数。
您再次诅咒,您从未遇到过UIKit这些问题。您可以在UIView的故事板上创建无限数量的元素。为什么SwiftUI在后方会如此痛苦。

这是因为SwiftUI将每个视图的视图元素数限制为十。除此之外,您还需要将元素分为逻辑组。 Apple绝对没有更好的编码习惯,因此没有技术上的理由决定将您限制在十个元素之内。

让我们来看另一个例子。回到UIKit。您需要使用外部循环中的值来计算内部循环中使用的值。这是一个好的编码实践。

class ViewController: UIViewController {
  override func viewDidLoad() {
  super.viewDidLoad()
  for col in 0 ..< 10 {
    let z = col * 10
    for row in 0 ..< z {
      let myLabel = UILabel(frame: CGRect(x: 100 + row, y: 100 + z, width: 100, height: 100))
      myLabel.text = "Hello World"
      view.addSubview(myLabel)
      }
    }
  }
}

您可以在SwiftUI中尝试相同的技巧,定义一些标签,一个循环并放入一个变量。但是-不,它又被打破了。为此,您需要创建一个位于循环之外的函数,并像这样在代码中内联调用它。

struct ContentView: View {
  var body: some View {
    VStack {
      ForEach(0 ..< 10) { col in
        ForEach(0 ..< returnM(col)) { row in
          Text("Row \(row) \(row + col)")
        }
      }
    }
  }
}
func returnM(col: Int) -> Int {
  return col * 10
}

这是编程的天堂还是仅仅是更好的编码。显然,正在发生什么。它有效地迫使您以某种方式(一种干净的结构化方式)进行编码。苹果担心UIKit无法强制执行并导致不良习惯的结构。

仍然是关于变量的主题,在UIKit中定义变量没有限制,可以在整个接口代码中分散定义和方程式。不,这肯定不是好的编程习惯。您能在SwiftUI中做到这一点吗?在SwiftUI中,您需要与控制视图的代码分开保存/定义变量和函数。不管是什么,还是天堂还是只是良好的编码习惯? SwiftUI强制执行它,而您的代码则更好。

多一个。现在看来这似乎不太可能,但是如果您尝试将11个组添加到一个视图中,则该视图也将不起作用,与View的视图具有相同的限制…但是请等待UIKit中没有这样的限制。这类似于限制方法中的行数。当然,这无疑是更好的编码实践。 swiftLint将为您检查一个限制,这也是您应该尝试并尊重的限制。这是更好的编码实践。

再问一个问题。我要学习UIKit,SwiftUI还是两者都学习。哪个先。在我的书中,您需要先学习SwiftUI,然后再学习UIKit。这样做会为您带来构想代码的想法,而且一开始就不会养成不良习惯,否则您会做相反的事情。更好的是,尽管SwiftUI确实不支持完整的WYSIWYG界面来让您对UIKit的所有旋钮和按钮进行编码,这确实是对的,但它确实支持通过SwiftUI中的UIRepresentable对象对UIKit旋钮和按钮进行编码的方法。因此,学习SwiftUI,然后学习如何通过UIRepresentable对象将UIKit包含在其中,并最终学习UIKit,包括在Xcode中使用所见即所得的接口。