Swift JSON

作者 : admin 本文共87999个字,预计阅读时间需要220分钟 发布时间: 2024-06-17 共1人阅读
https://www.bilibili.com/read/cv32068675/

[
  {
    “id”: 32025753,
    “title”: “【100天学习SwiftUI】第0天 如何成为一名iOS开发人员”,
    “state”: 0,
    “publish_time”: 1708878554,
    “words”: 17718,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/047e9506f15ca656599ab3de44f720ad273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在这篇文章中,我想向您介绍我认为在 2021 年成为一名 iOS 开发人员需要做的事情。我的目标是两类人:Swift 的绝对初学者——以前从未为 iOS 构建过任何东西的人——以及还有所谓的假初学者,他们以前可能尝试过学习 Swift,但从未真正达到获得全职工作的目标。无论您现在处于什么级别,这里的目标都是相同的:让您处于合适的位置来申请公司的初级 iOS 开发人员职位。我们将探讨您应该学习的技能、您可以参加的课程、如何与社区建立联系、人们常犯的错误等等,最重要的是我将讨论的所有内容都将完全免费所以你不需”,
    “type”: 0,
    “dyn_id_str”: “902115592313503760”,
    “stats”: {
      “view”: 935,
      “favorite”: 5,
      “like”: 4,
      “dislike”: 0,
      “reply”: 0,
      “share”: 1,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32068675,
    “title”: “【100天学习SwiftUI】第1天 变量、常量、字符串和数字”,
    “state”: 0,
    “publish_time”: 1708937953,
    “words”: 10725,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/67dec712e9f70cd4b00b1b264ba577cb273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “为什么是Swift? 编程语言,但我认为你会非常喜欢学习Swift。这部分是出于实用原因——你可以通过App Store赚取很多钱!但也有很多技术上的原因。 你看,Swift是一种相对年轻的语言,仅在2014年推出。这意味着它没有许多老语言可能遭受的语言累赘,通常意味着有一种解决特定问题的方式。 同时,作为一种如此新的编程语言,Swift利用了建立在老语言成功之上的所有种类的新想法——有时是错误。例如,它使得不小心编写不安全代码变得困难,它使得编写清晰易懂的代码变得非常容易,并且它支持所有世界语言,所以你”,
    “type”: 3,
    “dyn_id_str”: “902370709042364418”,
    “stats”: {
      “view”: 499,
      “favorite”: 3,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32144664,
    “title”: “【100天学习SwiftUI】第2天 布尔值、字符串插值和检查点1”,
    “state”: 0,
    “publish_time”: 1709043417,
    “words”: 4481,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/2f2958fd47bbfe80fec539e077b58df8273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “如何用布尔值存储 到目前为止,我们已经了解了字符串、整数和小数,但同时出现了第四种数据类型:一种非常简单的类型,称为布尔值,它存储 true 或 false。如果您好奇,布尔值是以英国数学家乔治·布尔 (George Boole) 命名的,乔治·布尔花费了大量时间研究和撰写逻辑知识。 我说布尔值偷偷地出现了,因为你已经见过它们几次了: let filename = \”paris.jpg\” print(filename.hasSuffix(\”.jpg\”)) let number = 120 print(nu”,
    “type”: 3,
    “dyn_id_str”: “902823673737510950”,
    “stats”: {
      “view”: 633,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32221618,
    “title”: “【100天学习SwiftUI】第3天 数组、字典、集合和枚举”,
    “state”: 0,
    “publish_time”: 1709135593,
    “words”: 10730,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/8586f8465c3ee22f8da8fb382133af31273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “如何在数组中存储有序数据 希望在一个地方拥有大量数据是非常常见的,无论是一周中的几天、班级中的学生列表、过去 100 年的城市人口,还是无数其他示例中的任何一个。 在 Swift 中,我们使用数组进行分组。数组是它们自己的数据类型,就像String、Int、 和Double一样,但它们不是只保存一个字符串,而是可以保存零个字符串、一个字符串、两个字符串、三个、五十、五千万甚至更多字符串——它们可以自动适应保存为根据需要添加多个,并始终按照添加顺序保存数据。 让我们从创建数组的一些简单示例开始: var b”,
    “type”: 3,
    “dyn_id_str”: “903219566420688949”,
    “stats”: {
      “view”: 777,
      “favorite”: 1,
      “like”: 4,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32276003,
    “title”: “【100天学习SwiftUI】第4天 类型注释和检查点2”,
    “state”: 0,
    “publish_time”: 1709188745,
    “words”: 4315,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/85d9da8868b26c5b93ce41f28cd460ca273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “如何使用类型注释Swift 能够根据我们分配给常量或变量的数据来确定其保存的数据类型。然而,有时我们不想立即赋值,或者有时我们想覆盖 Swift 对类型的选择,这就是类型注释的用武之地。到目前为止,我们一直在制作这样的常量和变量:let surname = \”Lasso\”var score = 0这使用了类型推断:Swift推断它surname是一个字符串,因为我们要为其分配文本,然后推断它score是一个整数,因为我们要为其分配一个整数。类型注释让我们明确我们想要的数据类型,如下所示:let surna”,
    “type”: 0,
    “dyn_id_str”: “903447852494094389”,
    “stats”: {
      “view”: 539,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 1,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32333613,
    “title”: “【100天学习SwiftUI】第5天 If、switch 和三元运算符”,
    “state”: 0,
    “publish_time”: 1709286725,
    “words”: 14049,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/3d1a20ce4ffd0e2d688cece35dec5c45273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “如何检查条件是真还是假程序经常做出选择:如果学生的考试成绩超过 80 分,则打印成功消息。如果用户输入的名字按字母顺序排在朋友的名字后面,则将朋友的名字放在前面。如果向数组添加一个数字使其包含超过 3 个项目,请删除最旧的一项。如果用户被要求输入姓名但没有输入任何内容,则为他们提供默认名称“匿名”。Swift 处理这些 withif语句,让我们检查条件并在条件为真时运行一些代码。它们看起来像这样:if someCondition { print(\”Do something\”)}让我们来分解一下:条件以 开”,
    “type”: 0,
    “dyn_id_str”: “903868673407582256”,
    “stats”: {
      “view”: 398,
      “favorite”: 1,
      “like”: 2,
      “dislike”: 0,
      “reply”: 2,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32393630,
    “title”: “【100天学习SwiftUI】第6天 循环、总结和检查点3”,
    “state”: 0,
    “publish_time”: 1709370830,
    “words”: 8681,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/8cd7b6b41ea787b2d74ed3915fc67657273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何使用for循环重复工作 计算机确实非常擅长执行重复性工作,而 Swift 可以轻松地将某些代码重复固定次数,或者对数组、字典或集合中的每个项目重复一次。 让我们从简单的事情开始:如果我们有一个字符串数组,我们可以像这样打印每个字符串: let platforms = [\”iOS\”, \”macOS\”, \”tvOS\”, \”watchOS\”] for os in platforms { print(\”Swift works great on \(os).\”) } 它会循环遍历 中的所有项目platform”,
    “type”: 3,
    “dyn_id_str”: “904229901625720837”,
    “stats”: {
      “view”: 508,
      “favorite”: 1,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 2,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32456687,
    “title”: “【100天学习SwiftUI】第7天 函数、参数及返回值”,
    “state”: 0,
    “publish_time”: 1709465355,
    “words”: 14409,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d67f4cdc109938c5239756895a618b60273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何通过函数重用代码 当您编写了一些您真正喜欢的代码并且想要一次又一次使用时,您应该考虑将其放入函数中。函数只是从程序的其余部分中分离出来的代码块,并给出了一个名称,以便您可以轻松地引用它们。 例如,假设我们有这个漂亮而简单的代码: print(\”Welcome to my app!\”) print(\”By default This prints out a conversion\”) print(\”chart from centimeters to inches, but you\”) print(\”ca”,
    “type”: 3,
    “dyn_id_str”: “904635883391549445”,
    “stats”: {
      “view”: 576,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32533127,
    “title”: “【100天学习SwiftUI】第8天 默认值、throwing函数和检查点4”,
    “state”: 0,
    “publish_time”: 1709566162,
    “words”: 6304,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/5ad4c77e18e49ebefa01b5a64173bab1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何为参数提供默认值 向函数添加参数可以让我们添加自定义点,以便函数可以根据我们的需要对不同的数据进行操作。有时我们希望提供这些自定义点以保持代码的灵活性,但有时您不想考虑它 – 十有八九您想要同样的东西。 例如,之前我们看过这个函数: func printTimesTables(for number: Int, end: Int) { for i in 1…end { print(\”\(i) x \(number) is \(i * number)\”) } } printTimesTables(f”,
    “type”: 3,
    “dyn_id_str”: “905068850476744711”,
    “stats”: {
      “view”: 688,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32654684,
    “title”: “【100天学习SwiftUI】第9天 闭包、传递函数到函数和检查点5”,
    “state”: 0,
    “publish_time”: 1709660931,
    “words”: 12736,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/5e826695c102b355dd06d6409d28b8d1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何创建和使用闭包 函数在 Swift 中是很强大的东西。是的,您已经了解了如何调用它们、传入值和返回数据,但您也可以将它们分配给变量、将函数传递给函数,甚至从函数返回函数。 例如: func greetUser() { print(\”Hi there!\”) } greetUser() var greetCopy = greetUser greetCopy() 这会创建一个简单的函数并调用它,然后创建该函数的副本并调用该副本。结果,它会打印相同的消息两次。 重要提示:复制函数时,不要在其后面写括号 – “,
    “type”: 3,
    “dyn_id_str”: “905475880228225033”,
    “stats”: {
      “view”: 592,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32748827,
    “title”: “【100天学习SwiftUI】第10天 结构体、计算属性和属性观察器”,
    “state”: 0,
    “publish_time”: 1709750847,
    “words”: 13587,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/024beae8179958f66d6b665ed6dd6ece273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何创建自己的结构体 Swift 的结构让我们可以创建自己的自定义复杂数据类型,并拥有自己的变量和函数。 一个简单的结构如下所示: struct Album { let title: String let artist: String let year: Int func printSummary() { print(\”\(title) (\(year)) by \(artist)\”) } } 这将创建一个名为 的新类型Album,其中包含两个名为title和的字符串常量artist,以及一个名为 的整”,
    “type”: 3,
    “dyn_id_str”: “905862066506563602”,
    “stats”: {
      “view”: 683,
      “favorite”: 1,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32769252,
    “title”: “【100天学习SwiftUI】第11天 访问控制、静态属性和方法及检查点6”,
    “state”: 0,
    “publish_time”: 1709795807,
    “words”: 6329,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/9abc8ddfa29e1bfa1c83202f200c2aa8273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何使用访问控制来限制对内部数据的访问 默认情况下,Swift 的结构体允许我们自由访问它们的属性和方法,但这通常不是您想要的——有时您想隐藏一些数据以防止外部访问。例如,也许您在触摸属性之前需要应用一些逻辑,或者您可能知道某些方法需要以某种方式或顺序调用,因此不应从外部触摸。 我们可以用一个示例结构来演示这个问题: struct BankAccount { var funds = 0 mutating func deposit(amount: Int) { funds += amount } muta”,
    “type”: 3,
    “dyn_id_str”: “906055163917107248”,
    “stats”: {
      “view”: 453,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32867418,
    “title”: “【100天学习SwiftUI】第12天 类、继承和检查点7”,
    “state”: 0,
    “publish_time”: 1709909326,
    “words”: 12810,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d9198d17df57812bf87b1ff460fe868b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何创建自己的类 Swift 使用结构来存储大部分数据类型,包括String、Int、Double和Array,但还有另一种方法可以创建称为类的自定义数据类型。它们与结构有许多共同点,但在关键地方有所不同。 首先,类和结构的共同点包括:
您可以创建并命名它们。
您可以添加属性和方法,包括属性观察器和访问控制。
您可以创建自定义初始值设定项来根据需要配置新实例。
然而,类与结构体有五个关键的不同之处:
您可以使一个类基于另一个类中的功能构建,获取其所有属性和方法作为起点。如果您想有选择地重写某些方法,您也”,
    “type”: 3,
    “dyn_id_str”: “906542724335796263”,
    “stats”: {
      “view”: 709,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 1,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 32925285,
    “title”: “【100天学习SwiftUI】第13天 协议、扩展和检查点8”,
    “state”: 0,
    “publish_time”: 1709988673,
    “words”: 17369,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/0a6270e4236b0479df40734c676900a7273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 如何创建和使用协议 协议有点像 Swift 中的契约:它们让我们定义我们期望数据类型支持哪些功能,而 Swift 确保我们的其余代码遵循这些规则。 考虑一下我们如何编写一些代码来模拟某人从家到办公室的通勤。我们可以创建一个小Car结构体,然后编写一个如下所示的函数: func commute(distance: Int, using vehicle: Car) { // lots of code here } 当然,他们也可能乘坐火车上下班,所以我们也这样写: func commute(distance”,
    “type”: 3,
    “dyn_id_str”: “906883517117366296”,
    “stats”: {
      “view”: 543,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33001620,
    “title”: “【100天学习SwiftUI】第14天 可选项、Nil合并和检查点9”,
    “state”: 0,
    “publish_time”: 1710064256,
    “words”: 11599,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/4e6ba1871bccc0412d6f816a2d767b52273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “如何使用选项处理缺失数据Swift 喜欢可预测,这意味着它尽可能鼓励我们编写安全且按我们期望的方式工作的代码。您已经遇到过抛出函数,但 Swift 还有另一种确保可预测性的重要方法,称为“可选” ——这个词的意思是“这个东西可能有值,也可能没有值”。要查看选项的实际效果,请考虑以下代码:let opposites = [ \”Mario\”: \”Wario\”, \”Luigi\”: \”Waluigi\”]let peachOpposite = opposites[\”Peach\”]在那里,我们创建了一个[String”,
    “type”: 0,
    “dyn_id_str”: “907208143602188304”,
    “stats”: {
      “view”: 551,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33026002,
    “title”: “常用 Swift 术语词汇表”,
    “state”: 0,
    “publish_time”: 1710088477,
    “words”: 8571,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/cfaea383326580b829670262434d372f273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “原英文页面链接:https://www.hackingwithswift.com/glossarySwift 中有如此多的语法和功能术语,有时很容易让人感到困惑。因此,此页面充当一站式术语词典,提供 Swift 语言中使用的所有常用术语的定义。@@autoclosure:附加到作为闭包的函数参数的属性,它要求 Swift 将使用它的任何代码默默地包装在闭包中,而不是要求用户手动执行。这个很少使用,但是在assert()功能上很重要。@available:附加到类型或函数的属性,将它们标记为对特定版本的 S”,
    “type”: 0,
    “dyn_id_str”: “907312176304226321”,
    “stats”: {
      “view”: 841,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33126512,
    “title”: “【100天学习SwiftUI】第15天 一小时内学习基本的 Swift”,
    “state”: 0,
    “publish_time”: 1710165525,
    “words”: 15338,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/509cda8e5a090d12c2784f34822fe8bb273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在本文中,我将在大约一小时内向您介绍 Swift 编程语言的基础知识。 本文针对两类人:一类人已经完成了 SwiftUI 100 天课程的介绍并正在寻求快速回顾,另一类人是拥有其他语言经验并希望将自己的技能转移到 Swift 的人。 我们会快速行动,因为这只是一本入门书 – 如果您发现自己很难理解某些内容,请访问SwiftUI 100 天以完成更长、更详细的介绍。 让我们开始吧! 创建常量和变量 Swift 可以创建常量和变量,但常量通常更可取。 使用它来创建然后更改变量字符串: var name = \””,
    “type”: 3,
    “dyn_id_str”: “907643090636898307”,
    “stats”: {
      “view”: 636,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33186823,
    “title”: “【100天学习SwiftUI】第16天 项目一WeSplit 第一部分”,
    “state”: 0,
    “publish_time”: 1710264378,
    “words”: 10199,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/85d18444524bb8d3d60c74f24207dff5273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” WeSplit:项目简介 在这个项目中,我们将构建一个支票分割应用程序,您可以在餐厅用餐后使用它 – 您输入食物的费用,选择您想要留下多少小费,以及您有多少人。 然后它会告诉你每个人需要支付多少钱。 该项目并不试图构建任何复杂的东西,因为它的真正目的是以有用的方式教您 SwiftUI 的基础知识,同时还为您提供一个现实世界的项目,您可以根据需要进一步扩展。 您将学习 UI 设计的基础知识、如何让用户输入值并从选项中进行选择,以及如何跟踪程序状态。由于这是第一个项目,我们将缓慢而缓慢地进行,并解释一路上的”,
    “type”: 3,
    “dyn_id_str”: “908067661049495568”,
    “stats”: {
      “view”: 688,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33203280,
    “title”: “【100天学习SwiftUI】第17天 项目一WeSplit 第二部分”,
    “state”: 0,
    “publish_time”: 1710347983,
    “words”: 9409,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/7eb278d891ab55add7a4cf2bc21b784b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ” 使用 TextField 读取用户的文本 我们正在构建一个支票分割应用程序,这意味着用户需要能够输入支票的费用、有多少人分担费用以及他们想留下多少小费。 希望您已经看到这意味着我们需要添加三个@State属性,因为我们希望用户在我们的应用程序中输入三部分数据。 因此,首先将这三个属性添加到我们的ContentView结构中: @State private var checkAmount = 0.0 @State private var numberOfPeople = 2 @State private “,
    “type”: 3,
    “dyn_id_str”: “908426741808103446”,
    “stats”: {
      “view”: 691,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33210257,
    “title”: “【100天学习SwiftUI】第18天 项目一 第三部分 总结与挑战”,
    “state”: 0,
    “publish_time”: 1710395984,
    “words”: 1773,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/0ab088e0658bddacefd6854613a14adb273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您的第一个 SwiftUI 应用程序已经完成:干得好!我们已经涵盖了很多内容,但我也尝试着慢慢地进行,以确保一切都被理解——我们在未来的项目中还有更多内容需要涵盖,所以现在多花一点时间是可以的。 在此项目中,您将了解 SwiftUI 应用程序的基本结构、如何构建表单和部分、创建导航堆栈和导航栏标题、如何使用 和@State属性@FocusState包装器存储程序状态、如何创建用户界面控件(例如TextField和 )Picker以及如何使用 循环创建视图ForEach。更好的是,您有一个真正的项目可以展示”,
    “type”: 3,
    “dyn_id_str”: “908632904530133015”,
    “stats”: {
      “view”: 485,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33225787,
    “title”: “【100天学习SwiftUI】第19天 挑战一 转换器”,
    “state”: 0,
    “publish_time”: 1710484565,
    “words”: 9315,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/8dd5bbb9a93a14de13363d373eb4328a273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,您将面临第一个挑战日,这一天您需要使用迄今为止所学到的知识从头开始构建一个全新的应用程序。这可能会让您感到惊讶,因为您很可能认为到目前为止您还没有学到那么多。好吧,让我解释一下…… SwiftUI 的 100 天是我编写的第二个 100 天课程,虽然我知道最初的Swift 100 天非常受欢迎并且帮助了很多人,但事后我确实感觉到“如果我重来一遍,这就是我要改变的……” 其中一件事就是回顾并在最初的 Swift 时代添加更多的虚拟聊天,以帮助人们真正充分利用这些基础知识。但第二个变化是您今天遇到的变化”,
    “type”: 3,
    “dyn_id_str”: “909013361310564355”,
    “stats”: {
      “view”: 442,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33242509,
    “title”: “【100天学习SwiftUI】第20天 项目二 猜旗 第一部分”,
    “state”: 0,
    “publish_time”: 1710573277,
    “words”: 9438,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/6db0b44f43fd28c7f934946a6c313de3273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “猜旗:项目简介 在第二个 SwiftUI 项目中,我们将构建一个猜旗游戏,帮助用户了解世界上众多国旗中的一些。 这个项目仍然会很好很简单,但让我有机会向您介绍一系列新的 SwiftUI 功能:堆栈、按钮、图像、警报、资产目录等等。 我们的第一个应用程序使用了完全标准的 iOS 外观和感觉,但在这里我们将进行一些更加定制的内容,以便您可以看到使用 SwiftUI 是多么容易。 您需要为此项目下载一些文件,可以从 GitHub 上下载: https: //github.com/twostraws/Hackin”,
    “type”: 3,
    “dyn_id_str”: “909394376469250066”,
    “stats”: {
      “view”: 497,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33255708,
    “title”: “【100天学习SwiftUI】第21天 项目二 猜旗 第二部分”,
    “state”: 0,
    “publish_time”: 1710657888,
    “words”: 7407,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/7e321a8390f0bc48e65003dae5045f31273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “人们在学习编程时经常抱怨的一件事是,他们真的很想忙于制作他们拥有的大应用程序创意,但相反,他们需要遵循教程来制作完全不同的应用程序。 我知道这可能很烦人,但相信我:你所学到的任何东西都不会被浪费。当然,您可能永远不会制作猜旗游戏,但您在这里学到的概念 – 构建布局、跟踪状态、随机化数组等等 – 将使您受益多年。 奥普拉·温弗瑞曾经说过:“做你必须做的事,直到你能做你想做的事。” 在这 100 天的课程结束时,我希望您能够完全做您想做的事情,但同时坚持下去 – 您将在这里学习关键技能! 今天您需要完成三个主”,
    “type”: 3,
    “dyn_id_str”: “909757773647970312”,
    “stats”: {
      “view”: 502,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33269804,
    “title”: “【100天学习SwiftUI】第22天 项目二 猜旗 第三部分”,
    “state”: 0,
    “publish_time”: 1710738187,
    “words”: 847,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/f9cddce5011c4d5e050fb50a37df24d2273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在这个项目中,您了解了图像、堆栈、渐变、按钮等,以及一整套新的修改器,以帮助您的 UI 设计变得栩栩如生。 所有这些技能都将在您自己的 SwiftUI 应用程序中发挥作用 – 不是也许或可能,而是将会。正如苏斯博士所说:“读的越多,了解的东西就越多;你学的越多,你去的地方就越多。” 这就是本课程的目的:让您能够使用 SwiftUI 去任何地方,并构建任何可帮助您实现目标的应用程序。 在我们进入下一个主题之前,是时候暂停并回顾一下:您是否完全理解了所学到的所有内容?这意味着另一次测试,但也意味着另外三个编码”,
    “type”: 3,
    “dyn_id_str”: “910102655217434646”,
    “stats”: {
      “view”: 500,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33286982,
    “title”: “【100天学习SwiftUI】第23天 项目三 视图和修改器 第一部分”,
    “state”: 0,
    “publish_time”: 1710820018,
    “words”: 13240,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/6aa69ab33fe4aa67b0348c60b4c24775273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “沃尔特·迪士尼曾经说过:“魔法中没有魔法,一切都在于细节。” SwiftUI 也是如此:人们很容易看到它,并认为有各种各样的魔法让它如此高效地工作,但实际上,如果你看看幕后,你就会开始确切地看到它是如何工作的——并且这样做可以更好地了解如何使用它。 今天是我们的第一个技术项目,我们重点关注 SwiftUI 的两个基本组件:视图和修饰符。我们已经在使用它们了,但我们已经掩盖了它们的工作原理。好吧,今天就结束了:我们将详细介绍它们是什么、它们如何工作以及它们为何如此工作。 如果一切按计划进行,最终结果将不再那”,
    “type”: 3,
    “dyn_id_str”: “910454116696719430”,
    “stats”: {
      “view”: 464,
      “favorite”: 1,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 2,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33303586,
    “title”: “【100天学习SwiftUI】第24天 项目三 视图和修改器 第二部分”,
    “state”: 0,
    “publish_time”: 1710904478,
    “words”: 2247,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/9369b017335b88f5596acdf78ffe5742273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “阿尔伯特·爱因斯坦曾经说过:“任何傻瓜都可以知道;但任何人都可以知道。” 重点是理解”,这个项目的目的就是让您更深入地了解 SwiftUI 的运作原理。毕竟,您将在接下来的 76 天中使用它,因此在继续之前确保您的基础稳固是个好主意。 我本可以对你说“SwiftUI 使用结构体作为视图”或“SwiftUI 使用了some View很多”,事实上,当你只需要知道这一点时,我确实一开始就这么说了。但现在您已经超越了基础知识,重要的是要对您正在使用的东西感到满意,以消除当您查看代码时不太了解某些东西的用途的烦人”,
    “type”: 3,
    “dyn_id_str”: “910816873912729621”,
    “stats”: {
      “view”: 433,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33317873,
    “title”: “【100天学习SwiftUI】第25天 里程碑 项目1-3总结”,
    “state”: 0,
    “publish_time”: 1710963175,
    “words”: 10707,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/846a151b7ebc97eca596d2caec1d04b4273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “里程碑:项目 1-3 又到了巩固一天的时间了,因为我们已经在前三个主题中涵盖了很多内容,如果您希望它们牢记在心,那么回顾它们非常重要。 然而,这也将是您被要求从头开始创建完整应用程序的另一天。是的,我知道几天前您已经制作了自己的完整应用程序,但请耐心等待 – 这种重复很重要! 有一个著名的故事,讲的是一位老师走进陶艺课并做了一个实验。全班一半学生被要求制作一个罐子,他们有一整天的时间尽其所能地制作出最好的罐子。另一半则被要求生产尽可能多的罐子。 一天结束时,老师把所有的花盆放在一起,让学生们选出最好的花盆”,
    “type”: 3,
    “dyn_id_str”: “911068971303698448”,
    “stats”: {
      “view”: 657,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 2,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33342598,
    “title”: “【100天学习SwiftUI】第26天 项目四 第一部分”,
    “state”: 0,
    “publish_time”: 1711086979,
    “words”: 8349,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/26b7b9fed83c8c0480504801cb66e3c1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们将启动一个新项目,我们将为您的收藏添加更多 SwiftUI 技能,同时还将解决一个令人着迷的编程领域:机器学习。 牛津大学教授尼克·博斯特罗姆 (Nick Bostrom) 曾表示,“机器智能是人类最后需要的发明。”真的吗?嗯,确实如此,如果我们能够教会计算机足够有效地思考,那么人类就不再需要进行这种思考,但另一方面,有些人可能会认为大多数人类一开始就没有进行太多思考。 尽管如此,我认为您会对它的入门如此简单以及它如何真正自然地融入 SwiftUI 印象深刻。 作为旁注,我想补充一点,现在您已经开”,
    “type”: 3,
    “dyn_id_str”: “911600709749702692”,
    “stats”: {
      “view”: 415,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33366346,
    “title”: “【100天学习SwiftUI】第27天 项目四 第二部分”,
    “state”: 0,
    “publish_time”: 1711206586,
    “words”: 7813,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/bd9a9f864986b041a1e21625b09bcf68273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将构建我们的项目,用极少的代码行将 SwiftUI 和 Core ML 结合起来——我想你会给你留下深刻的印象。 我希望您从这个项目中获得的东西(当然,除了所有 SwiftUI 的好处之外)只是对更广阔的应用程序开发世界的一瞥。 Core ML 只是 Apple 强大的框架之一,还有十多个框架:ARKit、Core Graphics、Core Image、MapKit、WebKit 等等,都在等待您准备好时发现。 我意识到您可能会想“哇,我们已经在研究机器学习了?”毕竟,这只是 100 天课程的”,
    “type”: 3,
    “dyn_id_str”: “912114413623836689”,
    “stats”: {
      “view”: 639,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33373524,
    “title”: “【100天学习SwiftUI】第28天 项目四 第三部分”,
    “state”: 0,
    “publish_time”: 1711252222,
    “words”: 3119,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/ac2053e85d21ba567f4146aed88dc8fa273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “这个项目为您提供了练习 SwiftUI 的一些基础知识、使用 和 学习一些新的 UI 控件DatePicker、Stepper亲自了解 Swift 如何轻松处理日期以及(只是为了好玩)涉足机器学习世界的机会。 所有这些东西都是相互独立工作的,我的意思是您现在可以在其他项目中单独使用Stepper、 或DateComponents、 或 创建 ML ——您所学到的东西可以带到您想要的任何地方。随着您使用 SwiftUI 的进步,您将添加越来越多的拼图块,在这样做的过程中,您会发现您很快就会拥有数百个块,您可”,
    “type”: 3,
    “dyn_id_str”: “912310418725142534”,
    “stats”: {
      “view”: 477,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 1,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33395114,
    “title”: “【100天学习SwiftUI】第29天 项目五 第一部分”,
    “state”: 0,
    “publish_time”: 1711356128,
    “words”: 6272,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/526ac615028e7661127cbf705a2171bd273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “是时候进行另一个新项目了,这实际上是我们在本课程中进行的最后一个简单项目 – 在此之后,随着我们处理更大的应用程序,难度级别会逐渐增加,所以在它持续的时候享受它吧! 在此应用程序中,您将了解应用程序开发的两个真正基础知识:List用于处理数据表和字符串,用于处理文本。是的,我们已经介绍了相当多的字符串,但现在我们真正要深入研究它们,包括如何使用它们的 Unicode 表示,以便我们能够与旧的 Objective-C 框架兼容。 Unicode 是一种存储和表示文本的标准,乍一看您可能会认为这听起来很简单。”,
    “type”: 3,
    “dyn_id_str”: “912756691597000772”,
    “stats”: {
      “view”: 390,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33413926,
    “title”: “【100天学习SwiftUI】第30天 项目五 第二部分”,
    “state”: 0,
    “publish_time”: 1711439861,
    “words”: 7624,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/12f6f02e6a8d04234b9a7a03f3c7fa90273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “现在您已经了解了该项目所需的技术,今天我们将实现我们的游戏。是的,这里会有大量的练习,是的,希望这对你来说是一个简单的项目。但这不应该阻止你满怀热情地解决它——尽你最大的努力! 试着记住美国作家兼讲师戴尔·卡内基的一些名言: “不要害怕为看似微不足道的工作竭尽全力。每次你征服一个目标,你就会变得更强大——如果你把小事做好,大事就会自然而然地发生。” 到目前为止,使用列表、数组、文本字段等对您来说绝对是小事,但是本课程的目标之一是为您提供这些基础知识的真正坚实的基础,并以了解什么是更伟大的事情为后盾。也是可”,
    “type”: 3,
    “dyn_id_str”: “913116322106179608”,
    “stats”: {
      “view”: 438,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33430445,
    “title”: “【100天学习SwiftUI】第31天 项目五 第三部分”,
    “state”: 0,
    “publish_time”: 1711512388,
    “words”: 2487,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/7a7119779f7291db1bf90cebe9df4c0b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: ““巨石”道恩·强森曾经说过,“成功并不总是与伟大有关,而是与一致性有关。坚持不懈的努力才能取得成功;伟大将会到来。” 显然,我希望让您尽可能快速有效地实现 SwiftUI 的伟大,但这需要您保持很大的一致性。公平地说,现在已经是第 31 天了,而且您不断回来,所以您正在履行协议中您的部分 – 干得好! 另一个项目完成后,你就可以自己处理事情了。是的,这是该项目的“艰苦工作”部分,您需要在没有我帮助的情况下完成一些挑战,并通过测试以确保您所学的内容深入人心。 你可以这样做! 今天,您应该完成项目 5 的总结”,
    “type”: 3,
    “dyn_id_str”: “913427823197159440”,
    “stats”: {
      “view”: 436,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33456211,
    “title”: “【100天学习SwiftUI】第32天 项目六 第一部分”,
    “state”: 0,
    “publish_time”: 1711622772,
    “words”: 7646,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/9b067cbbc29c262e4126851fe1f3d5af273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “当史蒂夫·乔布斯 (Steve Jobs) 介绍 Aqua(自 2001 年 Mac OS X 推出以来一直为 macOS 提供动力的视觉主题)时,他说:“我们让屏幕上的按钮看起来非常漂亮,让您忍不住想要舔它们。”我不知道你当时是否使用过 Mac,但多年来 Aqua 为我们提供了类似玻璃的按钮、针状条纹、拉丝金属等等,即使在今天,“精灵”窗口最小化看起来也令人惊叹。 当我们制作具有出色视觉吸引力的应用程序时,用户会注意到。当然,它不会影响应用程序的核心功能,而且很容易过度设计并导致核心部分丢失,但是当你做”,
    “type”: 3,
    “dyn_id_str”: “913901918877646936”,
    “stats”: {
      “view”: 415,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33472318,
    “title”: “【100天学习SwiftUI】第33天 项目六 第二部分”,
    “state”: 0,
    “publish_time”: 1711695730,
    “words”: 7603,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/f71afe74c0ca4cb350bf69a6bc2e55a4273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们将讨论更高级的动画,在这里您将开始更深入地了解动画的工作原理以及如何将它们自定义到令人惊叹的程度。 德国有一位著名的工业设计师,叫迪特·拉姆斯(Dieter Rams)。您可能没有听说过他,但您肯定见过他的作品 -多年来,从 iPod 到 iMac 和 Mac Pro,他的设计极大地启发了 Apple 自己的设计。他曾经说过:“好的设计是让一些东西容易理解、令人难忘;伟大的设计就是创造令人难忘且有意义的东西。” SwiftUI 强大的动画系统让我们能够轻松创建令人难忘的动画,但有意义的部分取决于您”,
    “type”: 3,
    “dyn_id_str”: “914215271097434136”,
    “stats”: {
      “view”: 363,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33489573,
    “title”: “【100天学习SwiftUI】第34天 项目六 第三部分”,
    “state”: 0,
    “publish_time”: 1711773083,
    “words”: 2017,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/e1212d1b2ece256e9e97092d6e0d2bdb273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “戴安娜·沙夫-亨特曾经说过,“目标是有期限的梦想。”好吧,我们知道您的目标是学习 SwiftUI,因为这就是您来这里的原因,所以现在也该添加一个截止日期了:您今天的任务是完成三个动画挑战,这将真正考验您的技能和创造力! – 进行测试。正如您将看到的,今天的挑战之一特别要求您发挥创造力并亲自尝试一些东西。您现在拥有创建各种动画和过渡的所有工具,因此阻碍您的只是练习的机会。嗯,就是这样——祝你好运!今天,您应该完成项目 6 的总结章节,完成其审核,然后解决其所有三个挑战。这个技术项目开始时比较简单,经历了一些”,
    “type”: 0,
    “dyn_id_str”: “914547499714215938”,
    “stats”: {
      “view”: 510,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33507932,
    “title”: “【100天学习SwiftUI】里程碑:项目 4-6”,
    “state”: 0,
    “publish_time”: 1711865844,
    “words”: 5528,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/1ad7a8f681aaec05f6520ffb8cd3d6ee273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “又到了巩固一天的时候了,像往常一样,我们有很多东西要回顾,有很多东西要更详细地探索,还有一个新的挑战要应对。如您所知,这些挑战是为您设计的,无需我太多帮助即可完成。是的,有一些提示,但仅此而已 – 如何解决它们取决于您,并且这是您按照自己的意愿解决问题的机会。这里的目标不仅仅是让您编写更多代码,尽管这很重要。这里的目标是让您适应新的 Xcode 项目 – 让您在面对新问题时充满信心,相信您有设计解决方案的技能,以及实际将该解决方案转化为工作代码的专业知识。我一直最喜欢的玛雅·安吉卢的名言是:“你不应该双手”,
    “type”: 0,
    “dyn_id_str”: “914945909430681637”,
    “stats”: {
      “view”: 491,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33529616,
    “title”: “【100天学习SwiftUI】第36天 项目七 第一部分”,
    “state”: 0,
    “publish_time”: 1711959922,
    “words”: 11477,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/629c43bc314a4147380aab8afe2b8be2273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “开源 Linux 操作系统的创建者 Linus Torvalds 曾经被问到他是否对想要构建大型软件项目的开发人员有什么建议。以下是他的回应: 任何人都不应该开始承担一个大型项目。你从一个琐碎的小项目开始,永远不要指望它会变得很大。如果你这样做,你就会过度设计,并且通常会认为它比当前阶段可能的更重要。或者更糟糕的是,您可能会被您设想的工作规模吓跑。 在编写本课程时,已经有人给我发电子邮件询问“为什么我不使用 X 来解决项目 1 中的问题?”或者“在项目 4 中,Y 会比 Z 好得多。”他们可能是对的,但如”,
    “type”: 3,
    “dyn_id_str”: “915349967096250375”,
    “stats”: {
      “view”: 431,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33575769,
    “title”: “【100天学习SwiftUI】第37天 项目七 第二部分”,
    “state”: 0,
    “publish_time”: 1712155078,
    “words”: 11044,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/00832f62e3c98ad279c30757b91a151e273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,您将使用 、 、 、 等构建一个完整@Observable的sheet()应用Codable程序UserDefaults。我意识到这看起来很多,但我希望你尝试思考背景中发生的所有事情:
@Observable监视类的更改并刷新所有受影响的视图。
sheet()监视我们指定的条件并自动显示或隐藏视图。
Codable可以将 Swift 对象转换为 JSON 并返回,几乎不需要我们编写任何代码。
UserDefaults可以读取和写入数据,以便我们可以更即时地保存设置。
是的,我们需要编写代码来将这些东”,
    “type”: 3,
    “dyn_id_str”: “916188155734917142”,
    “stats”: {
      “view”: 613,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33576035,
    “title”: “【100天学习SwiftUI】第38天 项目七 第三部分”,
    “state”: 0,
    “publish_time”: 1712156434,
    “words”: 3542,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/a79b42642ce8fb58a3700cca53219ef1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “这是另一个已完成的项目,并且涵盖了另一个大量 Swift 和 SwiftUI 知识。还有更多项目需要涵盖,但正如 F1 赛车手塞巴斯蒂安·维特尔 (Sebastian Vettel) 曾经说过的那样,“有时你需要按下暂停键,让一切都融入进来。”今天是您按下暂停键并让 SwiftUI 深入了解的机会。完成审核,接受挑战,如果需要,可以返回之前的巩固日挑战并解决它们。很多人给我发电子邮件询问“我能多快学会应用程序开发?”之类的问题。老实说,我为他们感到难过。当你匆忙时你无法学习。这两个目标与你的大脑是不相容的”,
    “type”: 0,
    “dyn_id_str”: “916193983999246352”,
    “stats”: {
      “view”: 671,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33585241,
    “title”: “【100天学习SwiftUI】第39天 项目八 第一部分”,
    “state”: 0,
    “publish_time”: 1712213243,
    “words”: 8060,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/147333f8e2907bd2fcf8200595615dec273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “当我在 2019 年第一次写这门课程时,Apple TV+ 刚刚推出。当时,大家谈论的节目是《为了全人类》,该剧讲述了1969年登月的另类历史。因此,我围绕该主题构建了今天的新项目,详细介绍了美国宇航局阿波罗太空计划背后的一些历史。 我还认为,如果今天的引言来自第一个登上月球的人尼尔·阿姆斯特朗,那将是合适的。早在 2000 年,他就说过:“科学是关于现状;工程就是关于什么是可能的。”我不知道你怎么想,但我发现这非常鼓舞人心:每次我们创建一个新的 Xcode 项目时,我们都有一个空白的石板可以使用,这可以”,
    “type”: 3,
    “dyn_id_str”: “916437972503494656”,
    “stats”: {
      “view”: 516,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33608634,
    “title”: “【100天学习SwiftUI】第40天 项目八 第二部分”,
    “state”: 0,
    “publish_time”: 1712335579,
    “words”: 11545,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/e6f34f5d981c341aefb08d992a2022d1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将完成应用程序的第一部分,特别是我们将正确获取数据。我意识到数据并不是非常令人兴奋,但随着您技能的增长,您将开始看到数据如何真正定义您的应用程序可以做什么 – 无论您添加什么奇特的设计,或者您引入什么流畅的动画,如果您的数据是不对,你的应用程序将无法工作。 在此过程中,您将遇到一个重要的 Swift 功能,称为泛型。这是我在 Swift 初学者之外肯定也喜欢的一个功能,但是正如您将看到的,泛型让我们只需一点额外的思考就可以创建高度可重用的代码。 可重用的代码很重要,因为它可以帮助我们以更少的工作”,
    “type”: 3,
    “dyn_id_str”: “916963401625763847”,
    “stats”: {
      “view”: 714,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33617049,
    “title”: “【100天学习SwiftUI】第41天 项目八 第三部分”,
    “state”: 0,
    “publish_time”: 1712385302,
    “words”: 5895,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/dc828a29bcbca164249273354ddcb4a8273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将通过添加另外两个视图以及它们之间的导航来完成我们的 Moonshot 应用程序,但在这里您将开始了解如何在 SwiftUI 中创建自定义布局 – 我们将使用容器相对框架来例如,完全按照我们想要的方式获取视图大小。 在此过程中,我们还将解决您作为程序员将面临的常见问题之一:当您有两块独立的数据需要以某种方式合并时。对于我们来说,这是我们的宇航员和任务数据,但正如您将看到的,这个概念是足够可转移的。 在今天的主题中,我曾一度鼓励您停下来尝试一下该设计。我确信有些人会跳过这一点,想要冲到最后,但我希”,
    “type”: 3,
    “dyn_id_str”: “917176960264699944”,
    “stats”: {
      “view”: 500,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33635275,
    “title”: “【100天学习SwiftUI】第42天 项目八 第四部分”,
    “state”: 0,
    “publish_time”: 1712470010,
    “words”: 5714,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/a47e05c7f6836af1961ded80f5b72d90273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您现在已经完成了 Moonshot,这是我们第一个开始变得困难的项目 – 需要更长的时间来解释,我们使用了自定义 SwiftUI 布局,我什至偷偷加入了一些高级 Swift 功能。并非我们所有未来的项目都会很困难,但它们肯定会更加复杂;它们还有更多功能,这意味着生成的应用程序更有趣,也更能代表现实世界的应用程序构建。随着复杂性的增加,犯错误的可能性也会增加,而 Swift 在这里是非常不宽容的——正如你现在无疑已经看到的那样,即使是第 20 行的一个小错误也可能导致第 5 行出现随机错误,这可以是令人沮丧”,
    “type”: 0,
    “dyn_id_str”: “917540778364895235”,
    “stats”: {
      “view”: 449,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33665315,
    “title”: “【100天学习SwiftUI】第43天 项目九 第一部分”,
    “state”: 0,
    “publish_time”: 1712571347,
    “words”: 3658,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d4f0bfac5fb2865726f9bd9394fe3793273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天启动另一个新技术项目,我们将重点关注导航。这是我们在上一个项目中简单触及的 SwiftUI 领域,但它确实是您将构建的几乎每个应用程序的核心。 正如您将看到的,导航实际上分为两种主要类型:由用户交互驱动的导航和您自己触发的编程导航。两者都很重要,您会发现自己可以自由地混合两者。 稍后您将探索的一件事是使用导航和使用工作表之间的区别。两者都很重要,而且您肯定会经常使用两者,但是当您这些天工作时,我希望您仔细考虑每个选择的含义以及为什么您认为应该使用其中一个而不是另一个 – 因为约翰·麦克斯韦说:“找到你”,
    “type”: 3,
    “dyn_id_str”: “917976021775417347”,
    “stats”: {
      “view”: 492,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33684561,
    “title”: “【100天学习SwiftUI】第44天 项目九 第二部分”,
    “state”: 0,
    “publish_time”: 1712641798,
    “words”: 6900,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/4dbd4297dd3fd1123ffd19611a010b9d273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将继续了解 SwiftUI 的导航,超越基础知识 – 如何处理编程导航,以及如何加载和保存导航路径,以便您可以恢复应用程序的状态。 最后一部分是应用程序开发中很小但很重要的一部分,但遗憾的是太多开发人员没有花时间来做好它。想一想:您使用应用程序一段时间,导航到精确的内容,然后离开应用程序一段时间去做其他事情。如果稍后重新启动应用程序时一切恢复原样,即使“稍后”实际上意味着几天后,那不是很好吗? 这只是今天的主题之一,我希望您能花时间来理解它。正如拉尔夫·沃尔多·爱默生(Ralph Waldo E”,
    “type”: 3,
    “dyn_id_str”: “918278602209886243”,
    “stats”: {
      “view”: 405,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33708910,
    “title”: “【100天学习SwiftUI】第45天 项目九 第三部分”,
    “state”: 0,
    “publish_time”: 1712726253,
    “words”: 2899,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/f9e7166131c0420caa2a05a4aec0c293273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将通过查看可用的自定义选项来完善您对 SwiftUI 导航的了解:自定义导航栏外观、将工具栏按钮放置在确切的位置以及允许用户编辑导航标题。 在这三者中,中间的一个是最重要的,因为它有两种变体:我们可以强制按钮的精确位置,或者我们可以通过语义位置来允许 SwiftUI 将按钮放置在对当前平台有意义的位置 – 而且根据需要应用额外的样式。 我喜欢史蒂夫·乔布斯的一句话:“有些人认为设计意味着它的外观。但当然,如果你深入挖掘,它实际上就是它的工作原理。”这就是像 SwiftUI 这样的声明式布局系统的”,
    “type”: 3,
    “dyn_id_str”: “918641333912993808”,
    “stats”: {
      “view”: 405,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33737270,
    “title”: “【100天学习SwiftUI】第46天 项目九 第四部分”,
    “state”: 0,
    “publish_time”: 1712832430,
    “words”: 3549,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/ce8972c64ca099a333cdc1e543addd43273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “另一个项目已经完成,此时您已经体验了几乎所有 SwiftUI 的导航 API。您很可能想重新开始构建应用程序,但请花点时间暂停并回顾您所学到的内容 – 您可能在一段时间内不会使用所有内容,但重要的是您至少记住所涵盖的内容,以便您能够稍后再参考。 所以,今天你还有另一次复习来测试你所记住的内容,还有一些让你自己编码的挑战。一如既往,我并没有解决这些挑战,但这就是重点——正如美国 NFL 球员 Troy Polamalu 曾经说过的那样,“我一直认为没有人能比我自己更能挑战我。” 你可以随心所欲地在任何时间、”,
    “type”: 3,
    “dyn_id_str”: “919097360416505907”,
    “stats”: {
      “view”: 449,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33754227,
    “title”: “【100天学习SwiftUI】第47天 里程碑 项目7-9”,
    “state”: 0,
    “publish_time”: 1712902259,
    “words”: 5304,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/027d960cfabd5a656a02efa1958ebf9b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “恭喜您成功完成另外三个项目!在完成我们的导航技术项目后,您可能会感到疲倦,但是今天和明天都应该是一个很好的节奏变化——今天是巩固日,明天会有点不同。 今天的挑战是一个有趣的挑战,老实说,如果您有时间,它有很大的潜力可以开发成更大的应用程序。像今天这样的日子很重要,因为它们给你一个完全在你掌握范围内的想法,并给你时间和范围来执行它。希望你能充分利用这一点——正如宇航员梅·杰米森曾经说过的那样,“我喜欢将想法视为潜在的能量:它们确实很棒,但除非我们冒险将它们付诸行动,否则什么都不会发生。” 所以,今天是行动日”,
    “type”: 3,
    “dyn_id_str”: “919397273665798177”,
    “stats”: {
      “view”: 385,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33797677,
    “title”: “【100天学习SwiftUI】第49天 项目10 第一部分”,
    “state”: 0,
    “publish_time”: 1713077654,
    “words”: 6793,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/658fcb04cecb76e000cf3fc338d8a4aa273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您已经离开了几天的时间来关注项目,我希望您利用这几天来回顾所学的内容,编写自己的代码一段时间,并反思昨天的视频中所说的内容。 正如已故伟大的齐格·齐格勒所说,“有两种肯定会失败的方式:思考却从不去做,或者做了却从不思考。”好吧,今天又回到了“做”的日子:我们有一个新项目要构建,这反过来又意味着需要学习一些新技术。 特别是,我们将迈出网络的第一步,这样您就可以看到 Swift 如何轻松地从互联网获取数据以在我们的应用程序中使用。当与处理 JSON 结合使用时Codable,这意味着我们可以直接从 Swift”,
    “type”: 3,
    “dyn_id_str”: “920150593770618883”,
    “stats”: {
      “view”: 472,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33815799,
    “title”: “【100天学习SwiftUI】第50天 项目10 第二部分”,
    “state”: 0,
    “publish_time”: 1713160499,
    “words”: 7634,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d61377701445204bb93c118dcba38a9e273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,在深入构建我们的应用程序的用户界面之前,我们将介绍另外两种技术。尽管您会熟悉今天工作的基本原理,但正如您将看到的,仍然有新的空间。随着我们不断突破 SwiftUI 的界限,这种情况将变得尤为常见——当您的应用程序很简单时,一切都会很容易,但当我们更多地尝试更大的应用程序时,您会发现我们需要花更多的时间来获得正确的细节。但没关系。正如美国轮胎巨头哈维·费尔斯通 (Harvey Firestone) 曾经说过的那样:“成功是细节的总和。”我希望你可以看看 Apple 的 iOS 应用程序并从中得到启发:”,
    “type”: 0,
    “dyn_id_str”: “920506410324721688”,
    “stats”: {
      “view”: 431,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33840189,
    “title”: “【100天学习SwiftUI】第51天 项目10 第三部分”,
    “state”: 0,
    “publish_time”: 1713252213,
    “words”: 8720,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/95a7429d0fa02cc52122b1ab5f58c92f273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “多年前,一家名为Sun Microsystems的公司提出了一句远远超前于时代的口号:“网络就是计算机”。今天,这似乎是显而易见的:无论我们身在何处,我们都依靠手机、笔记本电脑甚至手表来保持联系,因此我们可以收到来自世界各地的推送消息、电子邮件、推文等。想想看:我们今天的 iPhone 的名字来源于 iPod,而 iPod 的名字又来源于 iMac——一款早在 1998 年就推出的产品。“iMac”这个名字的营销人员 Ken Segall,特别说“I”代表“internet”,因为在90年代上网并不像今天”,
    “type”: 0,
    “dyn_id_str”: “920900314682359808”,
    “stats”: {
      “view”: 410,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33862131,
    “title”: “【100天学习SwiftUI】第52天 项目10 第四部分”,
    “state”: 0,
    “publish_time”: 1713335935,
    “words”: 1004,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d02464ac1eb68e4af19102eb89717a58273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “我们在这里开展的每个新项目都会向您单独介绍新概念,然后在真实应用程序的背景下再次介绍新概念,目标是在不同情况下向您展示同一事物两次,帮助它更深入地融入您的长期记忆。但今天,随着我们的应用程序完成,是时候进行长期过程的另一个重要部分了:测试您记住的内容,以及帮助您进一步推动的一些挑战。不管你喜欢与否,这一步很重要——正如宇航员约翰·杨曾经说过的,“进步的最大敌人是知识的幻觉。”相信我:知道你理解某件事比认为你理解它要好得多。这就是为什么我不断地向你灌输要点:我希望你对此感到厌倦,Form以至于你几乎可以自己”,
    “type”: 0,
    “dyn_id_str”: “921259897916489761”,
    “stats”: {
      “view”: 386,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33888213,
    “title”: “【100天学习SwiftUI】第53天 项目11 第一部分”,
    “state”: 0,
    “publish_time”: 1713437199,
    “words”: 8671,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/0b640638276b4e52176bef01c87a4a1e273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们要开始另一个新项目,这才是事情真正开始变得严肃的地方,因为你将学习一项重要的新 Swift 技能、一项重要的新 SwiftUI 技能和一项重要的应用程序开发技能,所有这些都将在在我们构建项目时很有用。 您将学习的应用程序开发技能是 Apple 的框架之一:SwiftData。它负责管理数据库中的对象,包括读取、写入、过滤、排序等,在 iOS、macOS 等应用程序开发中非常重要。以前我们将数据直接写入UserDefaults,但这只是一个短期的事情,可以帮助您学习 – SwiftData 是真正的”,
    “type”: 3,
    “dyn_id_str”: “921694827775524865”,
    “stats”: {
      “view”: 456,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33916730,
    “title”: “【100天学习SwiftUI】第54天 项目11 第二部分”,
    “state”: 0,
    “publish_time”: 1713521852,
    “words”: 6478,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/767037b51fdbd036406ff53f29189e29273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将开始应用您学到的新技术来构建我们的应用程序,使用 SwiftData 创建书籍和自定义RatingView组件,让用户存储他们对每本书的喜欢程度,使用@Binding. 我们处理数据的方式对我们的工作至关重要。有时就像弄清楚什么应该是整数、什么应该是字符串一样简单;有时它需要一点理论知识,例如能够在数组和集合之间进行选择;还有一些时候,这意味着我们需要考虑对象如何相互关联。 我非常喜欢 Linus Torvalds 的一句话:“糟糕的程序员担心代码;糟糕的程序员担心代码。”优秀的程序员担心数据”,
    “type”: 3,
    “dyn_id_str”: “922058405350211603”,
    “stats”: {
      “view”: 448,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33940980,
    “title”: “【100天学习SwiftUI】第55天 项目11 第三部分”,
    “state”: 0,
    “publish_time”: 1713614861,
    “words”: 6557,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/fb4d215d659f80ca2412e91f0e2a5edc273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “当我们今天完成我们的应用程序时,我希望您能够停下来并意识到您已经了解了多少 SwiftUI。例如,要为我们的应用程序构建详细信息屏幕,将利用 SwiftData、VStack剪辑ZStack形状、间隔符等 – 您现在应该对这些东西感到非常满意,这表明您已经走了多远。 尽管如此,总是有新的东西需要学习,今天将包括如何删除 SwiftData 对象、如何使用 排序查询SortDescriptor以及如何向警报添加自定义按钮。正如美国哲学家弗农·霍华德(Vernon Howard)所说,“在生活中始终像有新东西”,
    “type”: 3,
    “dyn_id_str”: “922457876001193990”,
    “stats”: {
      “view”: 450,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33960610,
    “title”: “【100天学习SwiftUI】第56天 项目11 第四部分”,
    “state”: 0,
    “publish_time”: 1713673578,
    “words”: 2158,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/b7956393c83068c313164f5f4fc096b3273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在跟随我制作一个项目几天后,您是时候走出舒适区并开始编写自己的代码了。再说一次,这些挑战是我根据你迄今为止所学到的一切给你设置的,这意味着如果你下定决心,它们绝对在你的掌握之中。艾米·莫林(Amy Morin)是一名社会工作者,后来成为作家,她曾经说过:“你越多地练习忍受不适,你就会对自己接受新挑战的能力越有信心。”这是所有这些挑战的根本目标:给你一点动力,让你自己尝试一些东西,弄清楚什么是有效的,并且 – 坦率地说 – 在你找到正确的解决方案之前搞砸几次。把事情做好是有价值的,但把事情做错也同样有价值。”,
    “type”: 0,
    “dyn_id_str”: “922710063557115904”,
    “stats”: {
      “view”: 484,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 33989630,
    “title”: “【100天学习SwiftUI】第57天 项目12 第一部分”,
    “state”: 0,
    “publish_time”: 1713748740,
    “words”: 6507,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/af286b25c9f6e0a124d74859ccb789fd273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在这个技术项目中,我们将探索 SwiftData 和 SwiftUI 如何协同工作来帮助我们构建出色的应用程序。我已经向您介绍了项目 11 中的主题,但在这里我们将讨论更多细节:自定义托管对象子类、确保唯一性等等。 美国企业家吉姆·罗恩曾说过:“成功既不神奇也不神秘——成功是坚持应用基本原则的自然结果。” SwiftData 绝对是这些基本原理之一 – 您当然不会在每个项目中都使用它,但了解它的工作原理以及如何充分利用它将使您成为更好的应用程序开发人员。 今天,您需要完成三个主题,其中您将学习如何使用 S”,
    “type”: 3,
    “dyn_id_str”: “923032881905795081”,
    “stats”: {
      “view”: 516,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 2,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34056178,
    “title”: “【100天学习SwiftUI】第58天 项目12 第二部分”,
    “state”: 0,
    “publish_time”: 1713870921,
    “words”: 6028,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/1058d72553e97f098b7887ed6ad9b99f273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将介绍更先进的 SwiftData 技术——这些技术在功能和实用性方面真正使应用程序与众不同。其中一些需要一些时间来学习,特别是因为当我们更多地了解 SwiftData 时,您将开始看到它如何严重依赖宏。坚持下去!正如 Maya Angelou 所说,“所有伟大的成就都需要时间”——了解 SwiftData 为我们所做的一切需要做一些工作,但它会得到回报,我相信您会喜欢在应用程序中一起使用 SwiftData 和 SwiftUI 。今天您需要完成三个主题,您将在其中了解NSPredicate、动”,
    “type”: 0,
    “dyn_id_str”: “923557649585274889”,
    “stats”: {
      “view”: 466,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34073278,
    “title”: “【100天学习SwiftUI】第59天 项目12 第三部分”,
    “state”: 0,
    “publish_time”: 1713929641,
    “words”: 3430,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/e6079f96cad281f2415a5e1255e393c4273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您准备好迎接更多挑战了吗?美国歌手兼词曲作家克里斯蒂娜·格里米曾说过:“人并非生来坚强,而是人会一点点变得坚强,遇到困难,学会不逃避。”对于优秀的程序员来说也是如此:当你读了一年书时,并没有神奇的开关被按下,相反,当你面对并解决越来越困难的问题时,你的技能会随着时间的推移而缓慢增长。我一直鼓励您解决这些问题,因为编写自己的代码并找到自己的解决方案很重要。一开始通常会出现一些空白页综合症——你茫然地盯着屏幕,不知道从哪里开始。但这没关系,事实上这是可以预料的。你练习得越多,你就会越善于为自己找到解决方案,今”,
    “type”: 0,
    “dyn_id_str”: “923809845758394400”,
    “stats”: {
      “view”: 400,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34102978,
    “title”: “【100天学习SwiftUI】第60天 里程碑:项目 10-12”,
    “state”: 0,
    “publish_time”: 1714032125,
    “words”: 7648,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/180fc69ef1ad90ac41bc93e2711eebfe273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “这还完成了另外三个项目,并且您掌握了更多真正重要的技术。无论您的设计多么漂亮,或者您的应用程序想法多么聪明,对于任何优秀的应用程序来说,处理好用户数据几乎总是最重要的。当然,真正讨论的是“好”的含义。至少我希望这意味着“尊重”——未经他们同意,你不会分享任何内容,未经许可,你不会跟踪他们的活动,并且仔细存储任何个人数据。除此之外,您可能想要添加搜索或过滤,您可能需要云同步以便跨设备共享数据,您可能想让他们浏览或修改原始数据,等等。无论您用它做什么,学习使用用户数据都是一项很棒的技能,并且您在最后三个项目中”,
    “type”: 0,
    “dyn_id_str”: “924250015478579201”,
    “stats”: {
      “view”: 410,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34122539,
    “title”: “【100天学习SwiftUI】第61天 里程碑:SwiftData时间”,
    “state”: 0,
    “publish_time”: 1714111223,
    “words”: 2922,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/e573a509ec87238e22c2c68449215070273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “如果我对你说过,你的挑战是构建一个从网络获取数据的应用程序,将其解码为原生 Swift 类型,然后使用导航堆栈显示它 – 哦,顺便说一句,整个事情应该使用SwiftData……好吧,足以说明您可能会拒绝这个挑战。因此,我取而代之的是快速的:昨天我让您研究应用程序的基础知识,确保您理解 JSON、获得Codable正确的支持、仔细考虑您的 UI 等等。今天我要做的事情在任何现实世界的项目中都不可避免地会发生:我将向项目范围添加一个新的功能请求。这有时被称为“范围蔓延”,几乎在您从事的每个项目中都会遇到这种情”,
    “type”: 0,
    “dyn_id_str”: “924589734515179542”,
    “stats”: {
      “view”: 401,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34166806,
    “title”: “【100天学习SwiftUI】第63天 项目13 第二部分”,
    “state”: 0,
    “publish_time”: 1714282142,
    “words”: 4624,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/bd97a3d950488762182fa9085ecc9a2f273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们继续检查我们项目的技术,并开始更多地尝试 SwiftUI 感觉不太好用的地方。今天你将看到 Core Image 如何与 SwiftUI 集成,答案是“不是很好”。我们还将开始研究 UIKit 如何与 SwiftUI 集成,同样答案也不是很好 – 我们需要投入相当多的工作来将 UIKit 的圆钉挤入 SwiftUI 形状的孔中。我想在这里看到更好的东西吗?绝对可以——也许它会在 SwiftUI 的未来更新中出现。但我认为有一句匿名说法很适合这里:“永远不要让你想要的东西让你忘记你拥有的东西。”是”,
    “type”: 0,
    “dyn_id_str”: “925323826051416081”,
    “stats”: {
      “view”: 471,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34203883,
    “title”: “【100天学习SwiftUI】第64天 项目13 第三部分”,
    “state”: 0,
    “publish_time”: 1714383076,
    “words”: 3932,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/c1759398ff957c3ca96b2e178b299f5c273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “不管你相信与否,在进入实施阶段之前,我们还有一天的时间来讨论这个项目的技术,我把有趣的事情留到了最后。今天,您将了解如何将数据引入您的应用程序,并将其再次发送回来,这就是应用程序真正发挥作用的地方 – 用户喜欢能够引入他们现有的内容,以某种方式重新混合它,并且与他们的朋友分享结果。坚持下去!今天之后,我们将开始将所有这些概念付诸实践,这样您就非常接近构建部分了。从邮票中汲取灵感——正如作家乔什·比林斯(Josh Billings)曾经打趣的那样,“它的用处在于能够坚持一件事,直到它到达那里。”今天您需要完”,
    “type”: 0,
    “dyn_id_str”: “925757334274179112”,
    “stats”: {
      “view”: 407,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34249312,
    “title”: “【100天学习SwiftUI】第65天 项目13 第四部分”,
    “state”: 0,
    “publish_time”: 1714550074,
    “words”: 5004,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/9602e5a061b11fbe9409620f5534fdec273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们将把您刚刚学到的一些技术付诸实践,包括如何创建自定义绑定、如何将用户选择的图像引入您的应用程序以及如何将核心滤镜效果应用于图像。 我希望您注意到的一件事是我经常引导您回到我们之前讨论过的主题。这并非偶然:正如自助作家拿破仑·希尔(Napoleon Hill)所写,“任何想法、计划或目的都可以通过重复思考而被置于脑海中”——这种重复是我用来帮助你内化的几种方法之一所有这些代码如何组合在一起。 即使您今天没有完全理解这些概念,也没关系 – 我们将来会再次介绍它们。 今天您需要完成三个主题,其中您将使”,
    “type”: 3,
    “dyn_id_str”: “926474585246793809”,
    “stats”: {
      “view”: 434,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34265326,
    “title”: “【100天学习SwiftUI】第66天 项目13 第五部分”,
    “state”: 0,
    “publish_time”: 1714640039,
    “words”: 5029,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/9b49d2bcd5ae0d8c55c215ca091abf1b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “是时候对我们的应用程序进行最后的润色了,这将允许用户尝试不同的核心图像过滤器,然后与其他应用程序分享他们的结果。 今天的工作要求我们回到之前遇到的一些 Core Image 缺陷,即 Core Image 的古怪字符串类型 API。这里有足够的错误空间,所以慢慢来,仔细检查你的代码和我的代码,并记住莫舍软件工程定律:“如果它不能正常工作,不要担心 – 如果一切正常,你就会被淘汰一份工作。” 今天您有两个主题需要完成,您将在其中实践确认对话框、ShareLink等等。 使用confirmationDialo”,
    “type”: 3,
    “dyn_id_str”: “926860981955461142”,
    “stats”: {
      “view”: 418,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34279336,
    “title”: “【100天学习SwiftUI】第67天 项目13 第六部分”,
    “state”: 0,
    “publish_time”: 1714712694,
    “words”: 2681,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/32d7b45ceef99d10e276d42cd21fc781273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “这是一个困难的项目,主要是因为一旦我们引入 Core Image,我们就需要处理 Apple 旧框架的怪癖和复杂性。 不管你喜欢与否,在可预见的未来,你都需要了解苹果的旧框架,因为它们不会消失。请记住,有数亿行代码都是在没有 SwiftUI 的情况下编写的,如果您打算找到一份构建 iOS 应用程序的工作,那么您需要在某个时候拓宽您的视野。 今天是挑战日,所以您应该阅读总结章节,参加该项目的测试,然后完成三个挑战。正如宇航员约翰·杨所说,“进步的最大敌人是知识的幻觉”——现在花时间挑战自己比假设你知道一切要”,
    “type”: 3,
    “dyn_id_str”: “927173032800157735”,
    “stats”: {
      “view”: 477,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34302213,
    “title”: “【100天学习SwiftUI】第68天 项目14 第一部分”,
    “state”: 0,
    “publish_time”: 1714831080,
    “words”: 6657,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/6ce859d649255393d644bc0f1b043da1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您会很高兴知道今天是您一段时间以来最轻松的一天。这并不意味着我们正在研究不重要的东西,只是我们正在讨论的新技术几乎肯定会成为 Core Image 的一个受欢迎的突破! 我所能做的就是:趁它持续的时候享受它!明天我们将回到困难的话题,鉴于您在这 100 天内已经完成了三分之二的任务,我希望这不会让人感到意外。 继续前进!正如文斯·隆巴迪(Vince Lombardi)所说,“成功之前的唯一地方就是在字典里。” 今天您有四个主题需要学习,您将在其中学习如何实现Comparable、查找用户的文档目录等等。 “,
    “type”: 3,
    “dyn_id_str”: “927681496802656328”,
    “stats”: {
      “view”: 610,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34312313,
    “title”: “【100天学习SwiftUI】第69天 项目14 第二部分”,
    “state”: 0,
    “publish_time”: 1714890474,
    “words”: 6537,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/fd2757f815b992e1794fa75ba6e12d04273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在该项目技术概述的第二部分中,我们将介绍 iOS 上两个非常重要的框架:用于在应用程序中渲染地图的 MapKit,以及用于使用 Touch ID 和 Face ID 的 LocalAuthentication。 您不会感到惊讶,因为位置、指纹和面部识别对于用户来说确实是个人的,这意味着我们需要始终尊重他们。请记住,用户相信我们会始终以最谨慎和最用心的态度对待他们的数据,因此最好记住隐私、安全和信任是您的核心价值,而不是可选的附加价值。 埃尔维斯·普雷斯利 (Elvis Presley) 曾说过:“价值观就”,
    “type”: 3,
    “dyn_id_str”: “927936592077651984”,
    “stats”: {
      “view”: 543,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34329351,
    “title”: “【100天学习SwiftUI】第70天 项目14 第三部分”,
    “state”: 0,
    “publish_time”: 1714973617,
    “words”: 7848,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/4b330890f48f484c5dac3afec219400d273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “该项目将基于地图视图,要求用户将他们想要访问的地点添加到地图上。为此,我们需要放置 a Map,使其占据整个视图,跟踪其注释,以及用户是否正在查看地点详细信息。 我们将从全屏视图开始Map,给它一个显示英国的初始位置 – 当然,欢迎您更改它! 首先,添加额外的import一行,以便我们可以访问 MapKit 的数据类型: import MapKit 其次,在其中添加一个属性ContentView来存储地图的起始位置: let startPosition = MapCameraPosition.region”,
    “type”: 3,
    “dyn_id_str”: “928293688536203297”,
    “stats”: {
      “view”: 461,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34359388,
    “title”: “【100天学习SwiftUI】第71天 项目14 第四部分”,
    “state”: 0,
    “publish_time”: 1715099685,
    “words”: 3950,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/68323ac90265e24a0986feeea0869d7b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “达到这一点需要一段时间,但今天您将使用非常少的代码来实现一些应用程序功能 – 这应该是相对容易的一天! 更具体地说,您将看到如何根据枚举的值显示不同的 UI,如何为Comparable我们从网络请求获取的某些数据添加自定义一致性,等等。这里有一些重要的技术,但它们确实使我们的应用程序更上一层楼。 如果你发现这很难,你最好记住威廉·厄德利曾经说过的话:“雄心是通往成功的道路,坚持是你到达的交通工具。”您在开始本课程时表现出了雄心壮志,现在您已经坚持到了第 71 天,您也明显表现出了坚持! 今天您有两个主题需”,
    “type”: 3,
    “dyn_id_str”: “928835146493198338”,
    “stats”: {
      “view”: 601,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34366807,
    “title”: “【100天学习SwiftUI】第72天 项目14 第五部分”,
    “state”: 0,
    “publish_time”: 1715144425,
    “words”: 6623,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/cd3e530f8a6d39e7d555622e7fd13b6e273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天是这个项目编码的最后一天,我确信您期待明天的挑战和回顾 – 它应该对这么长的教程做出很好的改变。 不过,首先,我们需要讨论两个棘手的主题,其中一个对您来说确实是一个挑战,因为我们将重新构建我们的代码以使用 MVVM 设计模式。正如您将看到的,这有助于将我们项目中的逻辑与布局分开,但这也需要一些思考 – 尤其是因为您需要了解主要参与者的概念。 当您今天工作时,您很可能真的开始感觉到难度曲线在上升,因为我们的项目不断增长,规模和复杂性不断增加。我想借此机会提醒大家以下几点:
你不是一个人;每个人都必须经历”,
    “type”: 3,
    “dyn_id_str”: “929027307614502912”,
    “stats”: {
      “view”: 399,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34387846,
    “title”: “【100天学习SwiftUI】第73天 项目14 第六部分”,
    “state”: 0,
    “publish_time”: 1715231505,
    “words”: 3691,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/29951967ae49d66c002110080d9b79c6273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “这是另一个困难的项目,但你成功了,我希望你的头脑已经在思考如何使用你学到的技能。无论是为购物应用程序集成地图、使用 Face ID 来保护数据还是其他内容,从长远来看,您在这里学习的每项技能都将带来回报。 今天我们将进入该项目的审查和挑战部分,您可以在其中使用自己的一些代码进一步提升您的技能。正如拉尔夫·沃尔多·爱默生(Ralph Waldo Emerson)曾经说过的那样:“除非你尝试做一些超出你已经掌握的事情,否则你永远不会成长。”所以,把这当作成长的一天吧! 今天,您应该完成项目 14 的总结章节,”,
    “type”: 3,
    “dyn_id_str”: “929401309060136994”,
    “stats”: {
      “view”: 416,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34411927,
    “title”: “【100天学习SwiftUI】第74天 项目15 第一部分”,
    “state”: 0,
    “publish_time”: 1715325464,
    “words”: 5175,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/ac540f988f25c0112d8540215448c82e273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们有一个新技术项目,这次重点关注您可能没有考虑过的事情:可访问性。这是衡量具有不同访问需求的人们如何使用我们的应用程序的标准 – 他们可能需要更大的文本,他们可能需要我们避免某些颜色以帮助他们清楚地看到事物,他们可能需要我们的 UI 被读出,等等。 太多的开发人员完全忽视了可访问性的重要性,这导致应用程序对很多人来说完全不透明。苹果 iPod 的创始人托尼·法德尔 (Tony Fadell) 曾说过:“你的定义是由你所做的事情和你不做的事情决定的。” 当然,你可以跳过可访问性,90% 的人不会注意到”,
    “type”: 3,
    “dyn_id_str”: “929804864198803464”,
    “stats”: {
      “view”: 391,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34439712,
    “title”: “【100天学习SwiftUI】第75天 项目15 第二部分”,
    “state”: 0,
    “publish_time”: 1715405686,
    “words”: 5244,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/50df97595b145912bc5ba5180edea7ba273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们将回顾我们早期的三个项目,强调可访问性问题并解决它们。这可能看起来有点乏味,但我希望您再次思考一下我们的目标是什么:我们想要构建造福每个人的软件吗? 我希望答案是肯定的。纽约有一位律师格雷戈里·曼斯菲尔德(Gregory Mansfield)为残疾人权利而奋斗,他曾经写道:“无障碍不是慈善。无障碍并不是慷慨。无障碍并不是一种便利。无障碍并不是免费的。你不授予访问权—— 你确保它。” 当您学习今天的主题时,我希望您会感到惊喜:a) 这些东西实际上是多么简单,b) 它对其余代码的影响是多么小。一旦您意”,
    “type”: 3,
    “dyn_id_str”: “930149410782838839”,
    “stats”: {
      “view”: 391,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34464029,
    “title”: “【100天学习SwiftUI】第76天 项目15 第三部分”,
    “state”: 0,
    “publish_time”: 1715491518,
    “words”: 3119,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/ebf216b87cc72f41b7535a8fc40df312273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “既然您已经看到修复我们的项目是多么容易,那么您就可以继续这项工作,迎接一些挑战并回顾您所学到的知识。我认为您根本不会觉得这很困难,甚至可能会继续对 SwiftUI 的可访问性如此简单感到惊讶。 史蒂夫·鲍尔默(是的,就是那个史蒂夫·鲍尔默)曾经说过“无障碍设计就是好的设计——它对没有残疾的人和有残疾的人都有好处。”他是对的:花时间确保您的应用程序适合所有人,将为您的所有用户带来持久的好处。 今天,您应该完成项目 15 的总结章节,完成其审核,然后解决其所有三个挑战。 辅助功能:总结 可访问性并不是“拥有就”,
    “type”: 3,
    “dyn_id_str”: “930518056391671815”,
    “stats”: {
      “view”: 489,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34482303,
    “title”: “【100天学习SwiftUI】第77天 里程碑:项目 13-15”,
    “state”: 0,
    “publish_time”: 1715579700,
    “words”: 4432,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d03e7fbf77886bba672d57500b848c09273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您已经完成了两个艰巨的项目和另一个技术项目,但您对 SwiftUI 的了解现在才真正开始完善 – 我当然希望您开始意识到与 Apple 的旧框架相比,它是多么容易! 今天是时候停下来反思一下所讨论的内容了。我们还将更详细地深入探讨两个主题——运算符重载和属性包装器,因为这样做您将对我们所使用的内容有更深入的了解。今天的挑战是,您需要应用您学到的技能来构建一个全新的应用程序。 挑战为您提供了以实际方式测试学习成果的机会,为您提供了一个沙箱,您可以在其中真正表达自己并根据需要扩展自己,我希望也向您展示当您全神”,
    “type”: 3,
    “dyn_id_str”: “930896795218739280”,
    “stats”: {
      “view”: 332,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34482646,
    “title”: “【100天学习SwiftUI】第78天 是时候使用 MapKit 了”,
    “state”: 0,
    “publish_time”: 1715580478,
    “words”: 1248,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/8b45a4b95a27a6ac3a7d4f8ca5a752f1273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “昨天,您构建了一个新应用程序,可以从用户的库中导入照片,希望您对成品感到满意 – 或者至少在成品方面取得了巨大进展。 但是您的老板进来并要求一项新功能:当您查看导入的图片时,您应该显示一张带有图钉的地图,该图钉标记了添加该图片时它们所在的位置。它可能与照片并排在同一屏幕上,可能使用分段控件显示或隐藏,或者可能位于不同的屏幕上 – 这取决于您。无论如何,您知道如何放置图钉,并且还知道如何使用地图视图的中心坐标,因此唯一需要弄清楚的是如何获取用户的位置以与文本和图像一起保存。 虽然我确实希望你发挥你的技能,但”,
    “type”: 3,
    “dyn_id_str”: “930900136693858320”,
    “stats”: {
      “view”: 343,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34500043,
    “title”: “【100天学习SwiftUI】第79天 项目16 第一部分”,
    “state”: 0,
    “publish_time”: 1715664086,
    “words”: 3703,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/ca49090dfacbf9ce3288c648bf0c5180273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在这个项目中,您将学习 Swift 和 SwiftUI 的功能的完美组合;它确实有助于提高您的技能,并让您灵活地创建强大的应用程序。是的,即使到了 100 天已经 79 天了,仍然有很多新东西需要学习——正如 Lily Tomlin 所说,“成功之路总是在建设中”! 但请注意:这是一个相当漫长的项目。我尝试将其分解为更小、更简单的日子,以帮助使其更容易遵循,但如果您认为有很多东西需要学习,请不要灰心 – 确实有很多! 今天您需要完成三个主题,您将在其中了解列表选择、选项卡视图等。 热门前景:简介 在这个项”,
    “type”: 3,
    “dyn_id_str”: “931259230308007937”,
    “stats”: {
      “view”: 406,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34527667,
    “title”: “【100天学习SwiftUI】第80天 项目16 第二部分”,
    “state”: 0,
    “publish_time”: 1715758054,
    “words”: 4425,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/c8e3e91587b9c34a552cf8fe09572036273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,您将以 SwiftResult类型的形式解决一个棘手的概念,但为了平衡问题,我们还将介绍两个更简单的概念,所以希望您今天不会发现太多的工作。 Swift 的Result类型旨在解决当您知道事物 A 可能为真或事物 B 可能为真,但在任何给定时间只有一个可能为真时的问题。如果您将它们想象为布尔属性,那么每个属性都有两种状态(true 和 false),但它们总共有四种状态:
A是假的,B是假的
A 为真,B 为假
A 为假,B 为真
A 为真,B 为真
如果您确定选项 1 和 4 永远不可能(A 或 “,
    “type”: 3,
    “dyn_id_str”: “931662824101380096”,
    “stats”: {
      “view”: 317,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34557975,
    “title”: “【100天学习SwiftUI】第81天 项目16 第三部分”,
    “state”: 0,
    “publish_time”: 1715838147,
    “words”: 5127,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/32d24202d8d1e6ded6e386b8f4f36379273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们将讨论三个重要功能:SwiftUI 中的列表行滑动操作、iOS 中的通知以及 Xcode 中的 Swift 包依赖项。这是应用程序开发人员需要掌握的另外三个真正关键的功能,我希望您会发现它们都相对容易学习。 列出行滑动操作 – 当您在 iOS 中滑动行时出现的那些按钮 – 允许我们为布局中的行添加额外的操作。这是避免用户界面混乱的好方法,但我希望您在这样做时要小心。 Adobe 前副总裁、现任风险投资家斯科特·贝尔斯基 (Scott Belsky) 曾经说过,设计良好的用户体验有一条规则:“更多选”,
    “type”: 3,
    “dyn_id_str”: “932006816622051363”,
    “stats”: {
      “view”: 459,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34621117,
    “title”: “【100天学习SwiftUI】第82天 项目16 第四部分”,
    “state”: 0,
    “publish_time”: 1716015158,
    “words”: 4829,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/569249ba3d7fbeb7e3504b958628f1f0273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “是时候开始将新技术付诸实践了,这个项目太大了,需要三天的时间才能完成。但这已经是第 82 天了,所以你已经证明了自己有决心做出惊人的事情 – 正如航空先驱阿米莉亚·埃尔哈特曾经说过的那样,“最困难的是采取行动的决定,剩下的只是坚韧。” 今天我们将回到 SwiftData,因为这个应用程序非常适合在那里存储数据。我知道你可能认为我们只是在重复旧的东西,但请相信我:重复是学习中最重要的部分之一,我在今天和之前的 SwiftData 材料之间留了好几天的时间,特别是因为添加额外的空间有助于重新学习。 – 执法。”,
    “type”: 3,
    “dyn_id_str”: “932767073112686596”,
    “stats”: {
      “view”: 399,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34648607,
    “title”: “【100天学习SwiftUI】第83天 项目16 第五部分”,
    “state”: 0,
    “publish_time”: 1716102123,
    “words”: 10028,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/7a2b53b450b48c22e670cd2c62fa6eba273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “有一本经典的计算机科学书籍叫《计算机程序的结构与解释》,作者在序言中写了一些重要的话:“程序必须写给人们阅读,只是顺便让机器执行。” 值得读几遍,因为它对我们编写软件的方式有巨大的影响。当像 JavaScript 这样的语言可以自由地混合和匹配字符串、整数甚至数组时,为什么我们还要强迫自己使用数据类型呢?为什么我们要在代码中添加注释?为什么我们要尝试将事物分解为函数?为什么我们要进行访问控制? 所有这些以及更多的问题都可以用一句话来回答:因为我们的目标必须始终是让我们自己和其他开发人员清楚地了解我们的意图”,
    “type”: 3,
    “dyn_id_str”: “933140584919465988”,
    “stats”: {
      “view”: 384,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34649709,
    “title”: “【100天学习SwiftUI】第84天 项目16 第六部分”,
    “state”: 0,
    “publish_time”: 1716107900,
    “words”: 4711,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/8e3ca7d7ec9ed79649416ac4d7317c9c273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “这是一个漫长的项目,有很多东西需要学习,但今天是最后的代码。正如美国教授安吉拉·达克沃斯所说:“热情是普遍的;热情是普遍的;热情是普遍的。”耐力是罕见的”——开始本系列的第一天需要热情,但在第 84 天,你刚刚完成一个巨大的项目,所以很明显你也有很强的耐力。 该项目已经利用了一些重要的 SwiftUI 功能,例如选项卡栏、滑动操作和环境;一些重要的 Swift 功能,例如导入外部包和Result;甚至还有一些重要的 iOS 功能,例如 Core Image 和使用相机扫描代码。今天,我们将锦上添花,即添加”,
    “type”: 3,
    “dyn_id_str”: “933165401268813831”,
    “stats”: {
      “view”: 371,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34649947,
    “title”: “【100天学习SwiftUI】第85天 项目16 第七部分”,
    “state”: 0,
    “publish_time”: 1716109678,
    “words”: 4723,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d3046c4aea96b96d7bdd912c77bc2cf9273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “英国数学家艾萨克·牛顿曾说过:“如果说我看得更远,那是因为我站在巨人的肩膀上。”对于一个有史以来最有影响力的科学家之一来说,这是一个相当谦虚的观点! 我认为使用 Apple 的 API 也是如此。我可以自己编写 Create ML 吗?还是UIKit?或者 MapKit、Core Image 或 UserNotifications?也许是其中之一,如果我得到很多帮助,也许是其中两个,但这不太可能。 幸运的是,我不需要,你也不需要:Apple 拥有大量的 API,这意味着我们也站在巨人的肩膀上。即使像处理好”,
    “type”: 3,
    “dyn_id_str”: “933173037722763267”,
    “stats”: {
      “view”: 461,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34676881,
    “title”: “【100天学习SwiftUI】第86天 项目17 第一部分”,
    “state”: 0,
    “publish_time”: 1716198742,
    “words”: 5790,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/fae29618ea204b291f7f170f292e8a20273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “当苹果推出 iPhone X 时,他们放弃了 iPhone 诞生之初就存在的一些东西:HOME按钮。这个简单的硬件自最初发布以来就一直存在,作为一种帮助用户返回主屏幕的方式,无论他们在做什么以及使用什么应用程序 – 它使整个设备不再那么可怕。 但随着我们习惯于使用越来越大的玻璃面板,苹果开始更加依赖手势:我们获得了手势识别器、滑动终止应用程序、下拉和上拉系统功能菜单的能力等等。 但有了 iPhone X,苹果确实把事情提升到了一个新的水平,因为没有HOME按钮,几乎所有事情都变成了手势。苹果甚至在 WWD”,
    “type”: 3,
    “dyn_id_str”: “933555560392949812”,
    “stats”: {
      “view”: 354,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34701388,
    “title”: “【100天学习SwiftUI】第87天 项目17 第二部分”,
    “state”: 0,
    “publish_time”: 1716286796,
    “words”: 5214,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/679c9969b5d99b52152ed88568c2ef38273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “Cory House 曾经说过,“代码就像幽默。当你必须解释它时,那就很糟糕了。”我之前已经谈到过类似的事情 – 需要编写清晰的代码来有效地传达我们的意图是良好编程的标志,并且它将在未来节省大量的维护和测试时间。 今天,您将学习如何使用Apple的Combine框架来监控通知,您会发现代码非常简单,几乎不需要任何解释——尽管它允许我们对系统事件进行各种监控。 这并非偶然发生:Apple 花费了大量时间进行API 审查,此时跨职能的开发人员团队聚在一起讨论我们所说的API 的表面区域——它对我们最终用户开发”,
    “type”: 3,
    “dyn_id_str”: “933933749440086066”,
    “stats”: {
      “view”: 382,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 1,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34747803,
    “title”: “【100天学习SwiftUI】第88天 项目17 第三部分”,
    “state”: 0,
    “publish_time”: 1716476880,
    “words”: 7229,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/3348c9032bb5b4364a5d50f9c6703fb8273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “当史蒂夫·乔布斯 (Steve Jobs) 于 2007 年 1 月发布第一款 iPhone 时,他谈到了用户将如何与他们的新设备互动。看看他是怎么说的: “我们将使用世界上最好的指点设备。我们将使用我们生来就拥有的指点设备——生来就有十个。我们将用手指。我们将用手指触摸它。我们发明了一种称为多点触控的新技术,它非常了不起——它就像魔术一样。” 这标志着 iPhone 对我们行业的影响,这些话在今天看来显而易见——当然,我们用手指滑动,否则我们还能用什么呢?我仍然有一部与第一部 iPhone 同一年的 W”,
    “type”: 3,
    “dyn_id_str”: “934750154008821793”,
    “stats”: {
      “view”: 553,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34760562,
    “title”: “【100天学习SwiftUI】第89天 项目17 第四部分”,
    “state”: 0,
    “publish_time”: 1716534624,
    “words”: 5560,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/cbcd437591c6fb0b308f58f7beda33ef273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “随着我们继续实施项目,您将看到我们如何添加计时器来激励人们快速思考,我们如何结束应用程序(无论他们是否及时完成),以及如何对我们的布局进行一些简单的调整,以帮助确保我们的应用程序适合红绿色盲人群。 虽然我们在专门的技术项目中研究了无障碍功能,但在这里我们关注的是一个特定的无障碍需求。每 12 个男性中就有 1 个患有色盲,这是一个令人惊讶的常见无障碍需求,但正如无障碍倡导者 Debra Ruh 所说,“无障碍功能让我们能够挖掘每个人的潜力。” 不要让你的代码因某人的出生方式而阻碍他们。 今天您有三个主题需”,
    “type”: 3,
    “dyn_id_str”: “934998166874357817”,
    “stats”: {
      “view”: 323,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34779474,
    “title”: “【100天学习SwiftUI】第90天 项目17 第五部分”,
    “state”: 0,
    “publish_time”: 1716607608,
    “words”: 7640,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/cc79c9f64794fe91c998d955a310775a273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天,我们通过添加一些最终功能并修复大量错误来结束我们的程序。是的,我们的程序有错误,我将带您了解其中的一些错误,并向您展示如何修复它们。 当你学习编程时,在代码中发现错误可能会令人沮丧,因为感觉就像你搞砸了一样。但正如传奇的荷兰计算机科学家 Edsger Dijkstra 曾经说过的那样,“如果调试是消除错误的过程,那么编程一定是引入错误的过程。” 换句话说,修复错误是软件开发过程中的常态,因为我们并不完美。你越习惯于制造错误、发现错误和修复错误,你就会成为越优秀的开发人员。 今天您有两个主题需要解决,”,
    “type”: 3,
    “dyn_id_str”: “935311626441064448”,
    “stats”: {
      “view”: 322,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34780348,
    “title”: “【100天学习SwiftUI】第91天 项目17 第六部分”,
    “state”: 0,
    “publish_time”: 1716612329,
    “words”: 5732,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/7d61ab9d23a4b907f766589b8d9e8877273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “完成另一个应用程序后,您就该回顾一下所学的内容,并接受一些挑战,以确保您真正理解所涵盖的内容——这两件事很容易被跳过,但对于伟大的学习来说却是至关重要的。 美国总统约翰·肯尼迪曾经说过:“事情不会自然发生,而是被制造出来。”这句话直指这些挑战的核心。你需要自己动手编写代码,让事情自己发生,否则你拥有的只是一个想法。正如史蒂夫·乔布斯所说:“没有行动的想法就不是想法,而是遗憾。” 今天你应该完成项目 17 的总结章节,完成它的审查,然后解决它的所有三个挑战。 Flashzilla:总结 这是另一个大项目,但”,
    “type”: 3,
    “dyn_id_str”: “935331902978523157”,
    “stats”: {
      “view”: 416,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34784918,
    “title”: “【100天学习SwiftUI】第92天 项目18 第一部分”,
    “state”: 0,
    “publish_time”: 1716632996,
    “words”: 9503,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/2260f7d56e6977939c1f83829124a67c273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “在我们这 100 天的最后一个技术项目中,我们将研究 SwiftUI 如何处理布局和几何图形。是的,我知道你可能以为这类事情会更早被介绍,但 SwiftUI 的一大优点是它为我们做了很多工作——这种教程在本系列中出现得这么晚,证明了 SwiftUI 的标准布局有多好。 xkcd 漫画的作者 Randall Munroe 曾经说过:“如果你真的讨厌某人,那就教他们识别错误的字距。”如果你还不知道,字距就是字母之间的间距,错误的字距非常常见 – 一旦你学会识别它,你就会意识到它无处不在。 今天,我们将讨论对齐”,
    “type”: 3,
    “dyn_id_str”: “935420667119009863”,
    “stats”: {
      “view”: 395,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34808443,
    “title”: “【100天学习SwiftUI】第93天 项目18 第二部分”,
    “state”: 0,
    “publish_time”: 1716713422,
    “words”: 8696,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/f29249df19b3402ee958bc94be7118b5273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们继续我们的视图布局技术项目,探索我们可用的最强大的布局视图之一:GeometryReader。这让我们可以在运行时读取视图的大小和位置,并随着这些值随时间变化而不断读取它们。 我知道这听起来可能没什么特别的,但它为许多看起来很棒的迷人效果打开了大门,而且只需要一两行代码就可以创建。是的,一两行——一旦你理解了它的GeometryReader工作原理,我真的希望你能花点时间去尝试一下! 正如英国诗人威廉·布莱克曾经说过的,“获取知识的真正方法是实验”,所以,如果你真的想让这些东西留在你的脑子里,你就”,
    “type”: 3,
    “dyn_id_str”: “935766094370570243”,
    “stats”: {
      “view”: 311,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34808996,
    “title”: “【100天学习SwiftUI】第94天 项目18 第三部分”,
    “state”: 0,
    “publish_time”: 1716715602,
    “words”: 2984,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/23d217e32da5429b715144955052fc48273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “您准备好完成我们最后的技术项目了吗?我希望如此,因为您还有另一篇评论要完成,还有三个新的挑战要接受。我现在要警告您:所有挑战都涉及GeometryReader,因为它将迫使您清楚地思考每个视图的帧的计算方式,以及如何使用它们来创建有趣的效果。 我意识到这GeometryReader确实会让你头晕目眩,但要想学会熟练掌握并有效地使用它,唯一的方法就是练习、练习、再练习。 我以前引用过艾米·莫林的话,但今天我想最后一次引用。她说:“生活中最伟大的事情往往发生在我们的舒适区之外,怀疑自己能否走出舒适区会让你停滞”,
    “type”: 3,
    “dyn_id_str”: “935775457161248786”,
    “stats”: {
      “view”: 338,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34809341,
    “title”: “【100天学习SwiftUI】第95天 里程碑 项目16-18”,
    “state”: 0,
    “publish_time”: 1716717761,
    “words”: 11087,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/1d3b03e0d207a9a5e05cbbba79a4fb88273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “完成了两个大型项目和另一个技术项目后,是时候停下来反思一下学到的东西,更仔细地检查几个关键主题,然后接受新的挑战。这是你在这 100 天内的最后一个挑战,所以我挑选了一些不错的、灵活的任务——如果你愿意,你可以在 30 分钟内完成,但你也可以根据你的兴趣完成可选的额外任务。 这项挑战的好处在于,它为您提供了各种空间来随心所欲地开发应用,实现您认为最有趣或最有用的功能。关键在于您有一张空白画布,您可以自己决定如何将其变成现实 -您需要选择要处理的内容,设计您的 UI,修复您自己的错误,然后做好准备。 一如既”,
    “type”: 3,
    “dyn_id_str”: “935784734317871123”,
    “stats”: {
      “view”: 423,
      “favorite”: 0,
      “like”: 0,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34810803,
    “title”: “【100天学习SwiftUI】第96天 项目19 第一部分”,
    “state”: 0,
    “publish_time”: 1716724336,
    “words”: 8251,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/fb68a65ad7df8c5cfdda5abc99fa1c46273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “尽管到目前为止,我们所有的项目都是在 iPad 上运行的,但我们还没有真正花时间停下来深入研究它。不过,在我们的新项目中,情况发生了变化,因为我们将构建一个应用程序,充分利用 iPad 提供的所有额外空间,甚至充分利用 Max 尺寸的 iPhone 在横向模式下提供的空间。 尽管 Apple 在 2019 年将 iOS 分拆为 iPadOS,但 iPad 和 iPhone 的软件几乎完全相同。这意味着我们可以编写同时在两个平台上运行的代码,只需进行少量更改即可真正充分利用每个环境。 2010 年,史蒂夫·”,
    “type”: 3,
    “dyn_id_str”: “935812973690093593”,
    “stats”: {
      “view”: 474,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34831377,
    “title”: “【100天学习SwiftUI】第97天 项目19 第二部分”,
    “state”: 0,
    “publish_time”: 1716788663,
    “words”: 8374,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/b449ba72344157ce3e7f7cb3c304e8c4273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天我们将实现程序的前半部分,这意味着我们将获得一个滑雪胜地列表、一个显示更多信息的详细视图以及一个NavigationSplitView可以并排显示它们的视图。这本身应该不会给您带来问题,但在此过程中,您还将学习如何从包中加载静态示例数据、控制如何NavigationSplitView在 iPhone 上显示主视图和次视图,甚至如何更整齐地格式化字符串列表。 尽管您已经了解了使此代码正常运行所需的很多知识,但我们仍在第 97 天介绍新知识。我希望您不会因此而气馁——学习是一项重要的技能,在编程以及许多其”,
    “type”: 3,
    “dyn_id_str”: “936089251794124837”,
    “stats”: {
      “view”: 315,
      “favorite”: 0,
      “like”: 1,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34832920,
    “title”: “【100天学习SwiftUI】第98天 项目19 第三部分”,
    “state”: 0,
    “publish_time”: 1716794147,
    “words”: 8191,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/60f61a0543bd91c505e318f9a70f5b14273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “现在是时候编写我们最终项目的最后部分了,这意味着实现三个重要功能:调整 UI 以充分利用我们的可用空间、在点击每个设施时显示有关每个设施的更多信息以及让用户标记收藏夹。 前两个问题可能听起来很容易,但你会发现它们伴随着有趣的复杂性,需要花些心思才能解决。不过没关系——你现在已经快到 100 天的最后期限了,所以思考复杂的 SwiftUI 应该完全在你的能力范围内。四五周前,这些事情对你来说可能很难,但我希望现在它们几乎已经成为你的第二天性。正如 David A. Smith 曾经说过的,“事情只有在变得容”,
    “type”: 3,
    “dyn_id_str”: “936112805397921859”,
    “stats”: {
      “view”: 291,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34834785,
    “title”: “【100天学习SwiftUI】第99天 项目19 第四部分”,
    “state”: 0,
    “publish_time”: 1716799995,
    “words”: 3134,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/61a04ebec26269251ee959327eaa836b273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “现在我们的应用程序已经完成,是时候接受一些挑战来帮助巩固你的知识,然后进行快速测试以确保你记住了所学到的知识。 虽然这次前两个挑战相当容易,但我认为你会发现第三个挑战更艰难。希望你在过去 99 天的工作中已经建立了一些坚定的韧性,但即便如此,我希望你记住失败是可以的——正如西班牙作家 Jose Bergamin 所说,“准备好失败就是准备好成功。” 今天你应该完成项目 19 的总结章节,完成它的审查,然后解决它的所有三个挑战。 SnowSeeker:总结 这不是特别复杂的项目,但它仍然教会了新技能,例如拆”,
    “type”: 3,
    “dyn_id_str”: “936137922362474551”,
    “stats”: {
      “view”: 264,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34835618,
    “title”: “【100天学习SwiftUI】第100天 期末考试和结语”,
    “state”: 0,
    “publish_time”: 1716802172,
    “words”: 2545,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/d854c8c5665d9a4914904d9fd091ab18273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “今天是 SwiftUI 100 天的最后一天,这意味着你成功了。你经历了全部 100 天的学习、观看视频、参加测试、完成挑战和编写代码,你成功了。 尽管我们可能从未见过面,但我为你感到骄傲。这项挑战并不容易:我让你每天学习,我督促你回答一千多个关于 Swift 和 iOS 的问题,我给你布置了艰巨的挑战。 我毫不怀疑有些工作对你来说很困难——有时你可能要重复几天,你可能在这里或那里跳过一些挑战,甚至有可能你不止一次想过放弃。 但你没有放弃——你成功了。正如艾莎·泰勒所说,“成功不是没有失败,而是在失败中坚”,
    “type”: 3,
    “dyn_id_str”: “936147272506277929”,
    “stats”: {
      “view”: 309,
      “favorite”: 0,
      “like”: 3,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34837263,
    “title”: “【100天学习SwiftUI】尾声 SwiftData 入门”,
    “state”: 0,
    “publish_time”: 1716810020,
    “words”: 11068,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/576c2df6fc2d7a538a36b7bece40880c273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “SwiftData 入门 为了以实用的方式演示 SwiftData 的核心功能,我们将构建一个名为 Gusto 的应用程序,它可以跟踪您访问过的餐厅以及您对它们的看法。这为我们提供了足够的空间来探索设计数据模型、处理数据迁移等。 请使用应用程序模板创建一个新的 iOS 项目。将其命名为“Gusto”,但不要选择 SwiftData 进行存储 – 将其保留为 None,因为我希望您了解它是如何从头开始完成的。 当您获得新的空白项目时,我希望您立即按 Cmd+N 来创建一个新文件,因为我们将查看我们的数据模型”,
    “type”: 3,
    “dyn_id_str”: “936180983703535623”,
    “stats”: {
      “view”: 484,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  },
  {
    “id”: 34845479,
    “title”: “【100天学习SwiftUI】尾声 排序、过滤以及与 SwiftData 的关系”,
    “state”: 0,
    “publish_time”: 1716828557,
    “words”: 10786,
    “image_urls”: [
      “https://i0.hdslb.com/bfs/new_dyn/banner/9b0defb3ab50e9514ef3681fb0788b09273414934.png”
    ],
    “category”: {
      “id”: 34,
      “parent_id”: 17,
      “name”: “学习”
    },
    “categories”: [
      {
        “id”: 17,
        “parent_id”: 0,
        “name”: “科技”
      },
      {
        “id”: 34,
        “parent_id”: 17,
        “name”: “学习”
      }
    ],
    “summary”: “排序、过滤以及与 SwiftData 的关系 在对数据进行排序时,SwiftData 有两种方法:在 WWDC 视频和一些小项目中效果很好的简单版本,以及更复杂的版本,更能说明您将要构建的应用程序类型在真实生活中。 我将向您展示这两个选项,但我想您已经可以猜到第二个选项会更有用! 首先,简单但不是很有用的选项:我们可以将额外的参数传递给我们的@Query属性来控制排序发生的方式。这需要您正在使用的任何数据类型的关键路径,因此例如我们可以按餐厅名称排序,如下所示: @Query(sort: \Restaur”,
    “type”: 3,
    “dyn_id_str”: “936260599476649985”,
    “stats”: {
      “view”: 628,
      “favorite”: 0,
      “like”: 2,
      “dislike”: 0,
      “reply”: 0,
      “share”: 0,
      “coin”: 0,
      “dynamic”: 0
    },
    “like_state”: 0
  }
]

本站无任何商业行为
个人在线分享 » Swift JSON
E-->