当前位置: 首页 > news >正文

Xcode与Swift开发小记

文章目录

    • 引子
    • Xcode工程结构核心概念
    • Swift语法速记(TODO)
    • 小技巧
      • 单元测试中使用await
      • SwiftUI中使用List
      • View中取数据
    • 常见问题
      • Xcode添加package时连接github超时
      • Xcode无法修改快捷键,一闪而过

引子

鉴于React Native目前版本在iOS上开发遇到诸多问题,本以为搞RN只需理会Javascript开发,没想到冒出CocoaPod的一堆编译问题。所以横下一条心,决定直接进攻iOS本身。不管你是用React Native,还是用Flutter,iOS下的直接编程Swift或OC都是绕不过去的坎。

Xcode比Android Studio要香,模拟器运行快,当然配置更复杂。

十年前的2014年,苹果发布了Swift , 五年后的2019年,又发布SwiftUI。从此iOS开发的面貌焕然一新。

Swift 的最新版本是Swift 5.5,该版本于2021 年9 月发布。

SwiftUI 是Apple 开发的一种UI 框架,它首次在iOS 13 中引入,支持iOS、iPadOS、macOS、watchOS 和tvOS 等Apple 平台。 当前最新版本的SwiftUI 是在Xcode 13 中引入的SwiftUI 3.0。

Xcode工程结构核心概念

每一门编程语言都会有namespace, module, package这些基本概念,但定义上都存在一些差异。这些差异会影响到加载和相互调用关系。所以,学习一门编程语言,首要是弄清楚这些基本概念是如何定义的。

Xcode里有两个概念和其它开发工具不同,一个叫Schema,一个叫Target。Schema可以理解为解决方案,一个Schema可以对应不同的Target,生成物也不同。

  • Project和Workspace
  • Package:包是Swift Package Manager的概念,不是Swift语言的概念,包的根目录下需要存在一个Package.swift描述文件
  • Target: 通常也被称为build target,也就是构建的目标
    • 在创建项目的时候默认就会创建一个target,有时被称为主target
    • 一个工程里可以创建多个target,每个target都对应相应的模板
    • 一个包里可以有一个或多个target,也就是一个target列表。
    • 一个target是一个app bundle 或 framework。每个target构建后对应一个库或一个可执行文件作为product。
    • target之间存在依赖关系,可以在Xcode里定义某个target依赖哪些其它target
  • Module:很多编程语言里一个文件对应一个module,但Swift不是。
    • 模块是代码的集合,对应一个或多个文件,里面定义Swift的 类、函数等
    • 一个模块对应一个发布单元
    • 一个module就可以看成是一个project中的一个target,这个target的默认模块名称就是这个项目的名称(可以在target的Build Settings—Product Module Name配置)
    • 在同一个模块中所有的Swift类处于同一个命名空间,它们之间不需要导入就可以相互访问
  • namespace: 一个class或一个struct就定义一个namespace,或者说一个{}就对应一个namespace
    • Swift有命名空间,而Objective-C没有。
    • Swift并没有namespace这个关键字
  • Bundle:Xcode 工程项目本身就是在一个 Bundle 之下,开发者可以使用 Bundle.main 来获取其中的资源
  • Library 和 Framework:

Modules: Swift organizes code into modules. Each module specifies a namespace and enforces access controls on which parts of that code can be used outside of the module.
A program may have all of its code in a single module, or it may import other modules as dependencies. Aside from the handful of system-provided modules, such as Darwin on macOS or Glibc on Linux, most dependencies require code to be downloaded and built in order to be used.
When you use a separate module for code that solves a particular problem, that code can be reused in other situations. For example, a module that provides functionality for making network requests can be shared between a photo sharing app and a weather app. Using modules lets you build on top of other developers’ code rather than reimplementing the same functionality yourself.

Packages: A package consists of Swift source files and a manifest file. The manifest file, called Package.swift, defines the package’s name and its contents using the PackageDescription module.
A package has one or more targets. Each target specifies a product and may declare one or more dependencies.

namespace与文件名和路径无关,只与模块名有关。这一点不同于Java和Python。在Xcode中,创建group和folder是有区别的,group参与编译,创建group可以选择不创建folder,folder下文件不参与编译。folder是蓝色的,它是以文件夹的形式存在;group是黄色的,它是以分组的概念存在。

Swift工程结构示例:
在这里插入图片描述不管你是Run,还是Build,首先要明确你是针对哪个Schema。如下,你要选择对应的Schema才行。
在这里插入图片描述

创建了两个Target,其中一个是Unit Test,依赖主target。
在这里插入图片描述
在这里插入图片描述

Swift语法速记(TODO)

每一门编程语言都喜欢用不同的方式做和别人相同的事情。不知道这是故意标新立异,还是真的有某种道理,难道设计者不知道Java和C的语言风格已经成了大众的习惯吗?对于程序员来说只能选择接受。例如定义函数的关键字就有def, func, function等,Swift也不例外,也搞了一套自己的语法糖。

  • 常量用let,变量用var
  • 函数参数有标签,有名称,返回类型用箭头,传参需带参数名,要吐:-)
  • 字符串可以用单引号或双引号,多行字符串用三个单引号或三个双引号
  • 数组、Set、字典都是用中括号定义,都可以用for-in遍历
var shoppingList: [String] = ["Eggs", "Milk"] //数组
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"] // 集合
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] // 字典
  • as, as?, as!的区别:as向上转,as!向下转。不确定向下转型可以成功时,用类型转换的条件形式(as?),只有你可以确定向下转型一定会成功时,才使用强制形式(as!)
  • ??左边为nil的时候,取右边
  • 扩展: 扩展可以给一个现有的类,结构体,枚举,还有协议添加新的功能。类似与Javascript的原型机制
  • 协议:类似于Java的接口
  • subscript:用来索引对象。下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。
  • guard, if…else, if let用法的区别
  • ForEach需要item符合 Identifiable协议,如 ForEach(items, id: .pageId){}
  • mutating关键字
  • any和some:any 吾不知其为何物也,some 吾知其为何物,但不知道其具体实例

小技巧

单元测试中使用await

func testImageFetching() async throws {let (data, _) = try await URLSession.shared.data(from: url)
}

SwiftUI中使用List

List {ForEach(items, id: \.id) { item inText(item.name)}
}

View中取数据

.task is iOS 15+, so could go back to .onAppear if you need iOS 13+.

常见问题

Xcode添加package时连接github超时

由于Xcode不能直接设置代理,所以稳妥方式是手工下载github代码,再添加时选Local:
在这里插入图片描述刷新几把Xcode,有时需要关闭项目或关闭Xcode再重启,然后给target添加上对这些包的依赖即可:
在这里插入图片描述
官方给的解决方案是:

On the terminal xcodebuild -scmProvider system -resolvePackageDependencies -disablePackageRepositoryCache -workspace MyProject.xcworkspace -scheme MyScheme

On XCode after the xcodebuild finishes XCode - File - Packages - Resolve Package Versions.

Xcode无法修改快捷键,一闪而过

输入法改成自带的英文,不要用搜狗

相关文章:

Xcode与Swift开发小记

文章目录 引子Xcode工程结构核心概念Swift语法速记(TODO)小技巧单元测试中使用awaitSwiftUI中使用ListView中取数据 常见问题Xcode添加package时连接github超时Xcode无法修改快捷键&#xff0c;一闪而过 引子 鉴于React Native目前版本在iOS上开发遇到诸多问题&#xff0c;本以…...

日更【系统架构设计师知识总结3】存储系统

【原创精华总结】自己一点点手打、总结的脑图&#xff0c;把散落在课本以及老师讲授的知识点合并汇总&#xff0c;反复提炼语言&#xff0c;形成知识框架。希望能给同样在学习的伙伴一点帮助&#xff01;...

《TCP/IP详解 卷一》第7章 防火墙和NAT

7.1 引言 NAT通常改变源IP和源端口&#xff0c;不改变目的IP和目的端口。 7.2 防火墙 常用防火墙&#xff1a; 包过滤防火墙&#xff08;packet-filter firewall&#xff09; 代理防火墙&#xff08;proxy firewall&#xff09; 代理防火墙作用&#xff1a; 1. 通过代理服务…...

访问raw.githubusercontent.com失败问题的处理

1 问题 GitHub上的项目的有些资源是放在raw.githubusercontent.com上的&#xff0c;通常我们在安装某些软件的时候会从该地址下载资源&#xff0c;直接访问的话经常容易失败。 # 安装operator kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.1…...

Elasticsearch的基本安装教程,Elasticsearch+SpringBoot实现简单的增删改查功能

Elasticsearch 是一个开源的分布式搜索和分析引擎,最初由 Elastic 公司开发。它是基于 Apache Lucene 的搜索引擎构建的,提供了强大的搜索和分析功能,并支持实时数据检索和分析。 Elasticsearch 被设计用来处理大规模的数据集,它具有以下几个主要特点: 分布式架构: Elast…...

【Git教程】(五)分支 —— 并行式开发,分支相关操作(创建、切换、删除)~

Git教程 分支 1️⃣ 并行式开发2️⃣ 修复旧版本中的 bug3️⃣ 分支4️⃣ 当前活跃分支5️⃣ 重置分支指针6️⃣ 删除分支7️⃣ 清理提交对象&#x1f33e; 总结 对于版本提交为什么不能依次进行&#xff0c;以便形成一条直线型的提交历史记录&#xff0c;我们认为有 以下两个…...

Maven管理项目,本地仓库有对应的jar包,但还是报找不到

文章目录 业务场景错误提示分析过程解决办法 业务场景 settings.xml种配置了私服&#xff0c;但是有些依赖私服上没有&#xff0c;通过同事拷贝过来的。但是用maven打包时报红了。 错误提示 Idea Maven错误&#xff1a;was cached in the local repository, resolution will…...

手写JavaScript中的Promise.all方法(JS中Promise.all的执行过程)

简介&#xff1a; Promise.all是JavaScript中一种用于处理多个Promise对象的方法&#xff0c;该方法接收一个数组作为参数&#xff0c;并返回一个新的Promise对象。 这个新的对象会在所有Promise对象都成功解析后解析&#xff0c;解析的结果是一个数组&#xff0c;包含了所有P…...

IP设置教程

Win 7 固定Ip设定 https://jingyan.baidu.com/article/4b07be3cbc8e7348b380f31d.html Win 10 固定Ip设定 Win10 固定IP地址方法_win10设置固定ip地址怎么设置-CSDN博客 Win 11 固定Ip设定 https://jingyan.baidu.com/article/cb5d6105be5354415c2fe0d3.html TP-LINK…...

【Azure 架构师学习笔记】-Azure Synapse -- Link for SQL 实时数据加载

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Synapse】系列。 前言 Azure Synapse Link for SQL 可以提供从SQL Server或者Azure SQL中接近实时的数据加载。通过这个技术&#xff0c;使用SQL Server/Azure SQL中的新数据能够几乎实时地传送到Synapse&#xff08;…...

k8s(5)

目录 使用Kubeadm安装k8s集群&#xff1a; 初始化操作&#xff1a; 每台主从节点&#xff1a; 升级内核&#xff1a; 所有节点安装docker &#xff1a; 所有节点安装kubeadm&#xff0c;kubelet和kubectl&#xff1a; 修改了 kubeadm-config.yaml&#xff0c;将其传输给…...

【服务器数据恢复】ext3文件系统下硬盘坏道掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 一台IBM某型号服务器上有16块FC硬盘组建RAID阵列。上层linux操作系统&#xff0c;ext3文件系统&#xff0c;部署有oracle数据库。 服务器故障&检测&#xff1a; 服务器上跑的业务突然崩溃&#xff0c;管理员发现服务器上有2块磁盘的指示灯…...

Sentinel 动态规则扩展

一、规则 Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观&#xff0c;…...

UE5 UE4 自定义插件自动开启关联插件(plugin enable)

在我们自己编写UE4、UE5的插件时&#xff0c;常常需要开启相关联的插件进行功能编写。 例如&#xff1a;UE4/5 批量进行贴图Texture压缩、修改饱和度_ue4批量修改纹理大小-CSDN博客 而让插件使用者每次使用时&#xff0c;依次进行开启其他相关联插件确实有些麻烦。 如何只需要…...

Android摄像头横屏的时候_人脸预览横向显示_问题解决---Android原生开发工作笔记164

在Android系统的平板中发现一个问题,我们做的一个Android程序,横屏的时候,摄像头在上面, 然后这个时候程序中的一个人脸预览页面,横向手持平板,摄像头在上面,但是这个时候预览的摄像头画面却是很像头像朝左,也是横过来的. private int getCameraOrientation(int cameraId) {Ca…...

网络安全防御保护 Day6

深度检测技术 DFI&#xff08;深度包检测技术&#xff09;&#xff1a;主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对 数据包的内容进行识别。 DPI&#xff08;深度流检测技术&#xff09;&#xff1a;一种基于流量…...

自动驾驶消息传输机制-LCM

需要用到LCM消息通讯&#xff0c;遂研究下。 这里写目录标题 1 LCM简介2. LCM源码分析3 LCM C教程与实例3.1 安装配置及介绍3.2 创建类型定义3.3 初始化LCM3.4 发布publish一个消息3.5 订阅和接收一个消息3.6 LCM进程间通讯3.7 注意事项&#xff1f;3.7.1 当数据结构定义的是数…...

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式&#xff08;1&#xff09;分而治之&#xff08;2&#xff09;迭代式设计 3、架构设计的输入&#xff08;1&#xff09;概览&#xff08;2&#xff09;功能需求 - WH分析法&#xff08;3&#xff09;质量 - “怎么”分…...

【推荐算法系列十六】:协同过滤

文章目录 参考原理基于邻域的协同过滤算法基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;基于内容的协同过滤 基于模型的协同过滤算法 扩展优缺点 参考 推荐系统之神经协同过滤 原理 基于邻域的协同过滤算法 基于邻域的协同过滤算法又包括…...

linux动态库加载相关

linux下动态库搜索规则 (1)编译目标代码时指定的动态库搜索路径,也就是RPATH&#xff1b; (2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径&#xff1b; (3)配置文件/etc/ld.so.conf中指定的动态库搜索路径&#xff1b;配置完毕后需运行ldconfig命令生效&#xff1b; (4)默…...

微博相册批量下载终极指南:3步轻松获取高清图片收藏

微博相册批量下载终极指南&#xff1a;3步轻松获取高清图片收藏 【免费下载链接】Sina-Weibo-Album-Downloader Multithreading download all HD photos / pictures from someones Sina Weibo album. 项目地址: https://gitcode.com/gh_mirrors/si/Sina-Weibo-Album-Downloa…...

STM32实战:手把手教你用CubeMX和HAL库搞定RS485 Modbus从机(附避坑指南)

STM32CubeMX与HAL库实现RS485 Modbus从机开发全攻略 1. 现代嵌入式开发的技术选型 在工业控制、智能家居和物联网设备中&#xff0c;RS485总线因其抗干扰能力强、传输距离远等优势&#xff0c;依然是现场通信的首选方案。而Modbus作为建立在RS485物理层上的应用层协议&#xff…...

当经典运筹学遇上深度强化学习:我们离‘一键最优’的智能工厂还有多远?

深度强化学习重构制造业调度&#xff1a;从理论到落地的关键突破 走进任何一家现代化制造工厂&#xff0c;你都会看到数百台设备在同步运转&#xff0c;成千上万的零件在不同工序间流转。这种复杂场景下的生产调度&#xff0c;堪称工业界的"终极算法挑战"。传统运筹学…...

如何使用ui2/ui实现高效拖放操作:打造流畅的文件与数据传输体验

如何使用ui2/ui实现高效拖放操作&#xff1a;打造流畅的文件与数据传输体验 【免费下载链接】ui Platform-native GUI library for Go. 项目地址: https://gitcode.com/gh_mirrors/ui2/ui 在现代GUI应用开发中&#xff0c;拖放功能已成为提升用户体验的关键特性。本文将…...

别再只会用轮询了!GD32F103 USART中断与DMA传输实战对比(附代码)

GD32F103 USART通信三剑客&#xff1a;轮询、中断与DMA的实战抉择 在嵌入式开发中&#xff0c;串口通信就像空气一样无处不在——调试信息输出、传感器数据采集、设备间通信都离不开它。但很多开发者停留在最基础的轮询方式&#xff0c;就像只会用螺丝刀却面对一整套精密工具。…...

NVIDIA Profile Inspector深度解析:如何解锁显卡隐藏性能的7个关键技术

NVIDIA Profile Inspector深度解析&#xff1a;如何解锁显卡隐藏性能的7个关键技术 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 当你面对游戏帧率波动、画面撕裂或显卡性能未充分发挥时&#xff0c;…...

C++11列表初始化:告别混乱的终极方案

好的&#xff0c;我们来详细探讨 C11 中引入的列表初始化&#xff08;{}&#xff09;特性&#xff0c;理解它为何被称为解决初始化混乱问题的“最后一片净土”。问题背景&#xff1a;传统初始化方式的混乱在 C11 之前&#xff0c;C 提供了多种初始化方式&#xff0c;但各有局限…...

IIR滤波器设计实战:从Butterworth到参数调优的完整指南

IIR滤波器设计实战&#xff1a;从Butterworth到参数调优的完整指南 在数字信号处理领域&#xff0c;IIR&#xff08;无限冲激响应&#xff09;滤波器因其高效的频率选择特性而广受欢迎。与FIR滤波器相比&#xff0c;IIR滤波器能够在相同性能要求下使用更少的计算资源&#xff…...

小白必看!零基础 SRC 漏洞挖掘完整指南:该学什么,如何入门?

零基础入门SRC漏洞挖掘&#xff08;干货版&#xff09;&#xff1a;该学什么&#xff1f;怎么学&#xff1f; 摘要&#xff1a;很多零基础小白想入门SRC漏洞挖掘&#xff0c;却陷入“不知道学什么、从哪开始学”的误区&#xff0c;要么盲目跟风学复杂工具&#xff0c;要么跳过…...

科研效率革命:基于Hermes Agent的Meta分析自动化工作流——涵盖随机效应模型、亚组分析与Egger检验

Meta分析作为整合多项研究证据、提供高级别循证依据的核心方法&#xff0c;其传统流程往往受限于文献检索繁琐、筛选耗时、统计代码复杂及结果解读主观等多重瓶颈&#xff0c;导致一项完整的Meta分析从设计到产出常需数周甚至数月。随着AI Agent技术的突破性进展&#xff0c;以…...