Swift-19-基础入门

从本章开始大概用10篇左右文章介绍下Swift语言的基本用法。

简介

Objective-C作为一门比较老的语言, 缺少很多现代语言所具备的高级特性。Swift是目标是比C,C++, ObjC更安全可靠,从而减少开发者对在应用运行时出错的代码进行调试的时间成本。本系列课程做为Mac OS应用开发的一个子专题,在这个专题中笔者会详细介绍下Swift程序语法。

在同一项目中这两种语言可以同时汇编,正常情况下这两种语言可以相互调用,从Swift调用ObjectiveC时兼容性比较好,反之有些会出现一些问题,但还是不太建议在同一个项目中同时使用两种语言来开发。

如果您对ObjectiveC非常了解的话,建议对照着来学习,这样会更容易理解,也有助于您对这两种不同语言的把控。

目录大纲

下面是一个拟的一个大纲,暂时不包含SwiftUI的内容。

  1. 工具和语法:工具和类型
  2. 基础知识:条件语句、数、switch、循环、字符串、空类型、
  3. 容器和函数:数组、字典、集合、函数、闭包
  4. 枚举、结构体和类:枚举、结构体和类、属性、初始化、值类型和引用类型
  5. 高级编程:协议、异常、扩展、泛型、内存管理
  6. 事件驱动的应用:Cocoa应用、IOS应用

创建简单工程

此专题的学习中,我们还是使用XCode工具,笔者的Xcode版本为Version 13.4.1 (13F100),不同的XCode版本的界面会有少许的变化,文中的截图可能略有差异,但应该变化不大。

创建playground工程

Xcode提供了下类似python语言的Jutyper Notebook功能,叫做playground,整个基础部分都会使用playground来学习。在Xcode中会有4个选项,一般选择Blank即可:
在这里插入图片描述

  • blank:空白文档,只引入了最基础的Cocoa框架;
  • Game:引入了游戏套件,省去了从blank文档创建基础框架的过程;
  • Map:引入了地图套件,目的同Game一样;
  • Single View:引入了SwiftUI套件,学习SwiftUI时使用;

创建好后,主界面如下:
在这里插入图片描述
界面非常简单,从左到右依次是:源文件浏览区、源码编辑区、运行结果区;

import Cocoavar greeting = "Hello, playground"

多说一点,playground工程也不单单只是一个文件,它也是一种多文件的组合,只是对外暴露出了一个接口,打开包以后可看到它里面也包含了一系列的目录和文件:
在这里插入图片描述

创建Command Line Tool工程

如果您不喜欢playground,也可以使用project的方式来练习本专题的代码,区别不大。方法是在XCode工具中选择新建Command Line Tool模板,然后按如下界面配置。
在这里插入图片描述
在创建工程时注意选择工程类型和编程语言,界面如下:
在这里插入图片描述
main.swift:程序运行主函数,默认只有两行代码

import Foundationprint("Hello, World!")
  1. 两种工程不同的示例中的import引用不一样,这个关系不大,因为Cocoa包含了Function框架;而在基础部分我们也只会用到Function框架提供的API;
  2. 在本系列专题中笔者会使用 playground 工程来讲述Swift编程的知识,原因是可以省略好多print()函数;

Swift语言比较恶心的一点是对于每行语句最后的 ;分号并不敏感,纯靠缩进来识别代码,做为一个老java程序员对这一点确实是习惯了好长的时间,估计是从python语言学来的吧。

创建OSX应用

创建一个可编辑的文本应用

创建工程

在这里插入图片描述

  • 开发语言选择:swift
  • UI选择:storyboards

创建好后工程结构,默认是一种MVC架构的工程模式。
在这里插入图片描述

  • AppDelegate.swift:入口程序
  • ViewController.swift:视图控制器,相当于Controller
  • Document.swift:相当于Model
  • Assets.xcassets:应用图标和图片资源库
  • Main.storyboard:UI图形界面,相当于View
  • Info.plist:应用设置
  • swift2cocoa.entitlements:应用发布和运行设置

准备工作

设计UI界面

打开 Main.storyboard 文件。
在这里插入图片描述

拖动UI控件到设计面板上
在这里插入图片描述

设计视图控制器

添加一个文本和两个按钮事件

import Cocoaclass ViewController: NSViewController {@IBOutlet var textView: NSTextView!@IBAction func speakButtonClicked(_ sender: NSButton){print("The speak button was clicked")}@IBAction func stopButtonClicked(_ sender: NSButton){print("The stop button was clicked")}}

连接控件

方法有很多,主要是拖动,其中一种拖动方式如下图所示:
在这里插入图片描述
另一个拖动方式,把控件拖到controller上面
在这里插入图片描述

添加功能

语音朗读

修改Controller代码

class ViewController: NSViewController {@IBOutlet var textView: NSTextView!let speechSynthesizer = NSSpeechSynthesizer()var contents:String?{get{return  textView.string}set{textView.string = newValue ?? ""}}@IBAction func speakButtonClick(_ sender:NSButton){if(!textView.string.isEmpty){speechSyntheesizer.startSpeaking(textView.string)}else{speechSyntheesizer.startSpeaking("文档是空的")}}@IBAction func stopButtonClicked(_ sender: NSButton){speechSynthesizer.stopSpeaking()}}

文档保存

这里稍整理下代码,把M和C串起来

Controller
import Cocoaclass ViewController: NSViewController {@IBOutlet var textView: NSTextView!var contents: String? {get {return textView.string}set {textView.string = newValue}}let speechSynthesizer = NSSpeechSynthesizer()@IBAction func speakButtonClicked(_ sender: NSButton){speechSynthesizer.startSpeaking(textView.string)}@IBAction func stopButtonClicked(_ sender: NSButton){speechSynthesizer.stopSpeaking()}}
Document
import Cocoaclass Document: NSDocument {override init() {super.init()}enum Error: Swift.Error, LocalizedError {case UTF8Encodingcase UTF8Decodingvar failureReason: String? {switch self {case .UTF8Encoding: return "File cannot be encoded in UTF-8."case .UTF8Decoding: return "File is not valid UTF-8."}}}//文本内容var contents: String = ""//自动保存功能override class var autosavesInPlace: Bool {return true}//创建新文档或打开旧文档时调用,负责设置NSWindowController, as!是一个类型转符,相当于强转override func makeWindowControllers() {let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)//因为withIdentifier会返回很多不同的controller,所以这块需要强转一下let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController//连接controllerlet viewController = windowController.contentViewController as! ViewControllerviewController.contents = contentsself.addWindowController(windowController)}//保存文档时调用override func data(ofType typeName: String) throws -> Data {let windowController = windowControllers[0]let viewController = windowController.contentViewController as! ViewControllerlet contents = viewController.contents ?? ""guard let data = contents.data(using: .utf8) else {throw Document.Error.UTF8Encoding}return data}override func read(from data: Data, ofType typeName: String) throws {guard let contents = String(data: data, encoding: .utf8) else {throw Document.Error.UTF8Decoding}self.contents = contents}
}

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

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

相关文章

github,raw.githubusercontent.com 等网址登陆不上不去的设置方法

目录 提示域名解析错误: 出现的现象: 解决办法:修改host host改完不生效 解决方案1: 解决方案2: 提示域名解析错误: 出现的现象: 登陆github,raw.githubusercontent.com 等网…

Jmeter 接口造10w条用户数据

1、将mysql-connector-java-5.1.22-bin.jar放到D:\apache-jmeter-5.5\lib\ext目录下 2、在测试计划中,添加mysql-connector-java-5.1.22-bin.jar包路径 3、添加-线程组-添加-配置元件-jdbc connection configuration 4、配置jdbc连接参数 设置变量名称:…

关于 AssertionError: Torch not compiled with CUDA enabled 问题

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

javaWeb智能医疗管理系统

简介 在当今快节奏的生活中,智能医疗系统的崛起为医疗行业带来了一场革命性的变革。基于JavaWeb技术开发的智能医疗管理系统,不仅为医疗机构提供了高效、精准的管理工具,也为患者提供了更便捷、更个性化的医疗服务。本文将介绍一个基于SSM&a…

vue快速入门(二十九)echarts在vue中的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 echarts.js的下载途径echarts的饼图示范 echarts.js&#xff0c;点击跳转&#xff0c;右键另存即可 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><m…

小试牛刀!

1.从双倍数组中还原原数组&#xff08;力扣&#xff0c;vector&#xff09; java式c解法。 class Solution { public:vector<int> findOriginalArray(vector<int>& changed) {int n changed.size();if(n % 2 1) return {};map<int, int> mp;for(int c…

Applied Spatial Statistics(二)统计推断:排列测试

Applied Spatial Statistics&#xff08;二&#xff09;统计推断&#xff1a;排列测试 本笔记本演示了如何执行假设检验和 p 值计算的排列检验。 相关系数Moran’s I 相关性 import pandas as pd import matplotlib.pyplot as plt import numpy as np from scipy.stats imp…

pycharm永久改变sys.path

进入pycharm&#xff0c;选择file->settings->interpreter 在这里选择图中所示show all 再单击左上角减号右侧第三个&#xff0c;长得像思维导图的图标 之后添加你的路径&#xff0c;确认即可

2024最新面试跳槽,软件测试面试题的整理与解析

今天接着来说说测试工程师面试比较高频的面试题&#xff0c;大家可以通过面试题内的一些解析再结合自己的真实工作经验来进行答题思路的提取、整理。 硬背答案虽可&#xff0c;但容易翻车哦。能够举一反三才是重点&#xff01; 1&#xff1a;请介绍一下UI自动化测试中三种时间等…

【若依前后端分离】设置已选中内容条数

示例&#xff1a; 将已选中n行加在了分页中&#xff0c;有分页才可以选择已选中多少行。如果想要不加分页也可以展示已选中n行&#xff0c;自行修改部分代码即可。 关键代码&#xff1a; 这使用了span&#xff0c;可使用其他元素 使用了Vue.js的v-if指令来根据条件是否渲染该…

前端JS必用工具【js-tool-big-box】,时间日期转换学习一

这一小节&#xff0c;我们学习一下 js-tool-big-box 这个npm 前端工具库&#xff0c;关于时间日期格式转换的一部分&#xff0c;后续还会有。 目录 1 安装 2 项目中引入 3 工具使用 3.1 年月日时分秒的单独处理 3.2 以上方法中第一个参数 3.3 日期时间的转换 3.4 更个…

6.C++:继承

一、继承 //1.类中的保护和私有在当前类中没有差别&#xff1b; //2.在继承后的子类中有差别&#xff0c;private在子类中不可见&#xff0c;所以用protected&#xff1b; class person { public:void print(){cout << "name:" << _name << endl;c…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Push Button的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Push Button的使用及说明 文章编号&#xff1…

2024年华中杯数学建模竞赛全攻略:ABC题思路解析+代码实现+数据集+论文撰写+全程答疑

引言 &#xff08;比赛后所有题目资料在文末获取呀&#xff09; 华中杯数学建模竞赛是数学建模领域的一项重要赛事&#xff0c;它不仅考验参赛者的数学建模能力&#xff0c;还考验了编程技能、数据分析能力和论文撰写能力。为了帮助参赛者更好地准备2024年的竞赛&#xff0c;本…

RAG学习笔记系列(一)

RAG 介绍 RAG 全称为 Retrieval Augmented Generation&#xff08;检索增强生成&#xff09;。是基于LLM构建系统的一种架构。 RAG 基本上可以理解为&#xff1a;搜索 LLM prompting。根据用户的查询语句&#xff0c;系统会先使用搜索算法获取到相关内容作为上下文&#xff0…

pnpm 报错: ERR_PNPM_META_FETCH_FAIL

今天突然遇到一个报错&#xff0c;pnpm 报错&#xff1a; ERR_PNPM_META_FETCH_FAIL  GET https://registry.npm.taobao.org/vue%2Fcli-service: request to https://registry.npm.taobao.org/vue%2Fcli-service failed, reason: certificate has expired问题原因&#xff1a;…

when语法学习及判断主机别名实例

目录 1、概念 2、实例配置 2.1 编写剧本体验when的用法 2.2 执行剧本文件 2.3 使用ansible临时命令进行测试 1、概念 when是用于判断的语法&#xff0c;将其用在每个动作的下方进行判断&#xff0c;使得只有在满足条件才会执行。 2、实例配置-判断主机别名 在每个客户端中…

Compose 基础组件

文章目录 Compose 基础组件Modifier 修饰符Scaffold 脚手架 Compose 基础组件 Modifier 修饰符 在传统视图体系中&#xff0c;使用XML文件描述组件的样式&#xff0c;而在Compose中使用Modifier&#xff0c;每个基础的Composable组件都有一个modifier参数&#xff0c;通过Mod…

使用CCS软件查看PID曲线

在刚开始学习PID的时候&#xff0c;都需要借助PID的曲线来理解比例&#xff0c;积分&#xff0c;微分这三个参数的具体作用。但是这些曲线生成一般都需要借助上位机软件或者在网页上才能实现。如果是在单片机上调试程序的话&#xff0c;想要看曲线&#xff0c;一般就是通过串口…

【YOLOv5】使用yolov5训练模型时报错合集

文章目录 前言问题1 -- VsCode终端无法进入Anaconda创建的虚拟环境【问题描述】【问题分析】【解决方式】方法一方法二 问题2 -- 怎么在VsCode中为项目配置Anaconda创建的虚拟环境【问题描述】【解决方式】 问题3 -- yolov5训练模型时报错RuntimeError: result type Float cant…