Xcode与Swift开发小记

news/发布时间2024/5/16 5:42:30

文章目录

    • 引子
    • 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无法修改快捷键,一闪而过

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/NDWs/7728.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

MySQL进阶篇2-索引的创建和使用以及SQL的性能优化

索引 mkdir mysql tar -xvf mysqlxxxxx.tar -c myql cd mysql rpm -ivh .....rpm yum install openssl-devel ​ systemctl start mysqld ​ gerp temporary password /var/log/mysqld.log ​ mysql -u root -p mysql> show variables like validate_password.% set glob…

《图解HTTP》笔记2:http的构成

目录 1&#xff0c;查看浏览器上面一个具体的http请求 2&#xff0c;HTTP报文的具体构成 2.1&#xff0c;http的报文结构 2.2&#xff0c;http的请求报文例子 2.3&#xff0c;http的响应报文例子 1&#xff0c;查看浏览器上面一个具体的http请求 浏览器地址栏输入网址&…

小程序应用、页面、组件生命周期

引言 微信小程序生命周期是指在小程序运行过程中&#xff0c;不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件&#xff0c;帮助开发者更好地理解和利用小程序的生命周期。 …

怎么用Python高仿一个任务管理器

目录 一、引言 二、任务管理器的原理与实现方法 原理分析&#xff1a; 实现方法&#xff1a; 三、案例展示 定义TaskManager类&#xff1a; 定义添加新任务的函数&#xff1a; 定义删除任务的函数&#xff1a; 定义修改任务的函数&#xff1a; 编写主函数&#xff1a…

Unity数据持久化之PlayerPrefs

这里写目录标题 PlayerPrefs概述基本方法PlayerPrefs存储位置实践小项目反射知识补充数据管理类的创建反射存储数据----常用成员反射存储数据----List成员反射存储数据----Dictionary成员反射存储数据----自定义类成员反射读取数据----常用成员反射读取数据----List成员反射读取…

【计算机网络】传输层——TCP和UDP详解

文章目录 一. TCP和UDP简介二. UDP 协议详解1. UDP报文格式2. UDP的使用场景 三. TCP 协议详解1. TCP报文格式2. TCP协议的重要机制确认应答&#xff08;保证可靠传输的最核心机制&#xff09;超时重传连接管理&#xff08;三次握手、四次挥手&#xff09;&#xff01;&#xf…

[工具探索]VSCode介绍和进阶使用

相比较GoLand、PhpStorm、PyCharm、WebStorm的重量级内存占用&#xff0c;从Windows系统来&#xff0c;各种卡死&#xff0c;换到MacOS倒不会卡死&#xff0c;但是内存占用太多&#xff0c;影响体验&#xff0c;决定换到VSCode。当然这个过程需要适应过渡期&#xff0c;旧伙计都…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录&#xff0c;然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

音视频数字化(数字与模拟-电影)

针对电视屏幕,电影被称为“大荧幕”,也是娱乐行业的顶尖产业。作为一项综合艺术,从被发明至今,近200年的发展史中,无人可以替代,并始终走在时代的前列。 电影回放的原理就是“视觉残留”,也就是快速移过眼前的画面,会在人的大脑中残留短暂的时间,随着画面不断地移过,…

linux安装flink(单节点)

下载链接 https://downloads.apache.org/flink/flink-1.18.1/上传&#xff0c;解压&#xff0c;重命名&#xff0c;注意路径 tar -zxf /opt/flink-scala/flink-1.18.1-bin-scala_2.12.tgz -C /opt/flink-scala mv /opt/flink-scala/flink-1.18.1 /opt/flink-scala/flink环境变…

前端项目打包体积分析与优化

一、安装依赖分析工具 npm install webpack-bundle-analyz 二、修改webpack.config.js文件 1、导入上面下载的包 2、在plugins里创建实例 三、启动打包命令 npm run build 会弹出如下界面&#xff1a; 四、优化 1、通过CDN导入react-dom文件 修改webpack.config.js文件里…

Mysql索引优化导致死锁问题

1、背景 随着公司业务的发展&#xff0c;商品库存从商品中心独立出来成为一个独立的系统&#xff0c;承接主站商品库存校验、订单库存扣减、售后库存释放等业务。在上线之前我们对于核心接口进行了压测&#xff0c;压测过程中出现了MySQL 5.6.35死锁现象&#xff0c;通过日志发…

vim恢复.swp [BJDCTF2020]Cookie is so stable1

打开题目 扫描目录得到 关于 .swp 文件 .swp 文件一般是 vim 编辑器在编辑文件时产生的&#xff0c;当用 vim 编辑器编辑文件时就会产生&#xff0c;正常退出时 .swp 文件被删除&#xff0c;但是如果直接叉掉&#xff08;非正常退出&#xff09;&#xff0c;那么 .swp 文件就会…

从ChatGPT到Sora,来了解大模型训练中的存储

1 从chatGPT到Sora 2022年底&#xff0c;OpenAI推出人工智能聊天机器人ChatGPT&#xff0c;开启了大模型领域的“竞速跑”模式。2024年2月15日&#xff0c;随着视频生成模型Sora的横空出世&#xff0c;OpenAI再度掀起热潮。 Sora将视频生成内容拉到了一个全新的高度&#xff0c…

docker打包当前dinky项目

以下是我的打包过程&#xff0c;大家可以借鉴。我也是第一次慢慢摸索&#xff0c;打包一个公共项目&#xff0c;自己上传。 如果嫌麻烦&#xff0c;可以直接使用我的镜像&#xff0c;直接跳到拉取镜像&#xff01; <可以在任何地方的服务器进行拉取> docker打包当前din…

转运机器人,AGV底盘小车:打造高效、精准的汽车电子生产线

为了满足日益增长的市场需求&#xff0c;保持行业领先地位&#xff0c;某汽车行业电子产品企业引入富唯智能AMR智能搬运机器人及其智能物流解决方案&#xff0c;采用自动化运输措施优化生产节拍和搬运效率&#xff0c;企业生产效率得到显著提升。 项目背景&#xff1a; 1、工厂…

Request 和 Response详解

文章目录 1.Request和Response的概述2.Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式 2.3 解决post请求乱码问题 掌握学习目标内容讲解内容小结 2.4 Request请求转发 3.HT…

Python多线程编程:深入理解threading模块及代码实战【第99篇—Multiprocessing模块】

Python多线程编程&#xff1a;深入理解threading模块及代码实战 在Python编程中&#xff0c;多线程是一种常用的并发编程方式&#xff0c;它可以有效地提高程序的执行效率&#xff0c;特别是在处理I/O密集型任务时。Python提供了threading模块&#xff0c;使得多线程编程变得相…

网安入门16-XSS(三种类型)

什么是XSS漏洞——来自Google Gemini XSS漏洞&#xff0c;全称跨站脚本攻击&#xff08;Cross-Site Scripting&#xff09;&#xff0c;是代码注入的一种。它允许恶意用户将代码注入到网页上&#xff0c;原理是攻击者将恶意代码注入到可信网站的页面中&#xff0c;当用户浏览该…

C++:STL(标准模板库)

STL&#xff1a;主要是一些“容器”的集合&#xff1b;“容器”有&#xff1a;vector(数组)、list(双向链表)、deque(双向队列)、set(集合)、map(图&#xff1a;内部结构红黑树) STL也是算法和其他一些组件的集合&#xff0c;是泛型编程的一个经典范例。 STL的目的是标准化组…
推荐文章