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.hqwc.cn/news/630658.html

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

相关文章

ARouter之kotlin build.gradle.kts

ARouter之kotlin build.gradle.kts kotlin的配置需要用到kapt 项目的build.gradle.kts plugins {id("com.android.application") version "8.1.2" apply falseid("org.jetbrains.kotlin.android") version "1.9.0" apply falseid(&…

ElasticSearch实战之项目搜索高亮

文章目录 1. 前情配置2、数据操作2.1 操作API2.2 数据入库 3. 高亮搜索3.1 方法封装3.2 高亮搜索 1. 前情配置 为满足ElasticSearch可在项目中实现搜索高亮&#xff0c;我们需要先做一些前情配置 导入ElasticSearch依赖 <dependency><groupId>org.springframewor…

解析数据科学,探索ChatGPT背后的奥秘

在当今这个由数据驱动和AI蓬勃发展的时代&#xff0c;数据科学作为一门融合多种学科的综合性领域&#xff0c;对于推动各行各业实现数字化转型升级起着至关重要的作用。近年来&#xff0c;大语言模型技术发展态势强劲&#xff0c;为数据科学的进步做出了巨大贡献。其中&#xf…

基于ChatGPT打造安全脚本工具流程

前言 以前想要打造一款自己的工具&#xff0c;想法挺好实际上是难以实现&#xff0c;第一不懂代码的构造&#xff0c;只有一些工具脚本构造思路&#xff0c;第二总是像重复造轮子这种繁琐枯燥工作&#xff0c;抄抄改改搞不清楚逻辑&#xff0c;想打造一款符合自己工作的自定义的…

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

【Spring】Spring MVC入门

Spring MVC入门 一、什么是Spring Web MVC&#xff1f; 1.1 MVC定义 MVC是Model View Controller的缩写&#xff0c;是一种软件架构的设计模式&#xff0c;将软件系统分为模型、视图、控制器三个部分。 示意图如下: 可以看到&#xff0c;Controller作为一个“粘合剂”处于M…

Hive进阶(2)----HDFS写入数据流程(赋图助君理解)

HDFS写入数据流程 一、写入流程 1、 Client向NameNode发起RPC请求&#xff0c;来确定请求文件block所在的位置&#xff1b; 2、 NameNode会视情况返回文件的部分或者全部block列表&#xff0c;对于每个block&#xff0c;NameNode都会返回含有该block副本的DataNode地址&…

Go 单元测试之mock接口测试

文章目录 一、gomock 工具介绍二、安装三、使用3.1 指定三个参数3.2 使用命令为接口生成 mock 实现3.3 使用make 命令封装处理mock 四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩&#xff08;stub&#xff09;参数 六、总结6.1 测试用例定义6.2 设计测试用…

[蓝桥杯 | 暴搜] 学会暴搜之路

虽然会调侃蓝桥杯是暴力求解的&#xff0c;但是本弱弱不会搜&#xff0c;不知道如何搜&#xff0c;于是写下这篇碎碎念&#xff0c;记录看到过的&#xff0c;惊艳自己的暴搜。 小总结 题目特征&#xff1a;很复杂的排列组合 说是暴力&#xff0c;其实就是枚举罢了&#xff0…

量子时代加密安全与区块链应用的未来

量子时代加密安全与区块链应用的未来 现代密码学仍然是一门相对年轻的学科&#xff0c;但其历史却显示了一种重要的模式。大多数的发展都是基于几年甚至几十年前的研究。而这种缓慢的发展速度也是有原因的&#xff0c;就像药物和疫苗在进入市场之前需要经过多年的严格测试一样&…

【结构型模式】组合模式

一、组合模式概述 组合模式的定义与意图&#xff1a;将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。&#xff08;对象结构型&#xff09; 组合模式分析&#xff1a; 1.当容器对象的某一个方法被调用时&#xff0c;将遍…

VulnHub靶机 DC-5 打靶 渗透测试详情过程

VulnHub靶机 DC-5 打靶 详细渗透测试过程 目录 VulnHub靶机 DC-5 打靶 详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描目录爆破文件包含getshell反弹shell提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://download.vulnhub.com/dc/…