從本章開始大概用10篇左右文章介紹下Swift語言的基本用法。
簡介
Objective-C作為一門比較老的語言, 缺少很多現(xiàn)代語言所具備的高級特性。Swift是目標(biāo)是比C,C++, ObjC更安全可靠,從而減少開發(fā)者對在應(yīng)用運(yùn)行時(shí)出錯(cuò)的代碼進(jìn)行調(diào)試的時(shí)間成本。本系列課程做為Mac OS應(yīng)用開發(fā)的一個(gè)子專題,在這個(gè)專題中筆者會(huì)詳細(xì)介紹下Swift程序語法。
在同一項(xiàng)目中這兩種語言可以同時(shí)匯編,正常情況下這兩種語言可以相互調(diào)用,從Swift調(diào)用ObjectiveC時(shí)兼容性比較好,反之有些會(huì)出現(xiàn)一些問題,但還是不太建議在同一個(gè)項(xiàng)目中同時(shí)使用兩種語言來開發(fā)。
如果您對ObjectiveC非常了解的話,建議對照著來學(xué)習(xí),這樣會(huì)更容易理解,也有助于您對這兩種不同語言的把控。
目錄大綱
下面是一個(gè)擬的一個(gè)大綱,暫時(shí)不包含SwiftUI的內(nèi)容。
- 工具和語法:工具和類型
- 基礎(chǔ)知識:條件語句、數(shù)、switch、循環(huán)、字符串、空類型、
- 容器和函數(shù):數(shù)組、字典、集合、函數(shù)、閉包
- 枚舉、結(jié)構(gòu)體和類:枚舉、結(jié)構(gòu)體和類、屬性、初始化、值類型和引用類型
- 高級編程:協(xié)議、異常、擴(kuò)展、泛型、內(nèi)存管理
- 事件驅(qū)動(dòng)的應(yīng)用:Cocoa應(yīng)用、IOS應(yīng)用
創(chuàng)建簡單工程
此專題的學(xué)習(xí)中,我們還是使用XCode工具,筆者的Xcode版本為Version 13.4.1 (13F100),不同的XCode版本的界面會(huì)有少許的變化,文中的截圖可能略有差異,但應(yīng)該變化不大。
創(chuàng)建playground工程
Xcode提供了下類似python語言的Jutyper Notebook功能,叫做playground,整個(gè)基礎(chǔ)部分都會(huì)使用playground來學(xué)習(xí)。在Xcode中會(huì)有4個(gè)選項(xiàng),一般選擇Blank即可:
- blank:空白文檔,只引入了最基礎(chǔ)的Cocoa框架;
- Game:引入了游戲套件,省去了從blank文檔創(chuàng)建基礎(chǔ)框架的過程;
- Map:引入了地圖套件,目的同Game一樣;
- Single View:引入了SwiftUI套件,學(xué)習(xí)SwiftUI時(shí)使用;
創(chuàng)建好后,主界面如下:
界面非常簡單,從左到右依次是:源文件瀏覽區(qū)、源碼編輯區(qū)、運(yùn)行結(jié)果區(qū);
import Cocoa
var greeting = "Hello, playground"
多說一點(diǎn),playground工程也不單單只是一個(gè)文件,它也是一種多文件的組合,只是對外暴露出了一個(gè)接口,打開包以后可看到它里面也包含了一系列的目錄和文件:
創(chuàng)建Command Line Tool工程
如果您不喜歡playground,也可以使用project的方式來練習(xí)本專題的代碼,區(qū)別不大。方法是在XCode工具中選擇新建Command Line Tool模板,然后按如下界面配置。
在創(chuàng)建工程時(shí)注意選擇工程類型和編程語言,界面如下:
main.swift:程序運(yùn)行主函數(shù),默認(rèn)只有兩行代碼
import Foundation
print("Hello, World!")
- 兩種工程不同的示例中的import引用不一樣,這個(gè)關(guān)系不大,因?yàn)镃ocoa包含了Function框架;而在基礎(chǔ)部分我們也只會(huì)用到Function框架提供的API;
- 在本系列專題中筆者會(huì)使用 playground 工程來講述Swift編程的知識,原因是可以省略好多print()函數(shù);
Swift語言比較惡心的一點(diǎn)是對于每行語句最后的 ;分號并不敏感,純靠縮進(jìn)來識別代碼,做為一個(gè)老java程序員對這一點(diǎn)確實(shí)是習(xí)慣了好長的時(shí)間,估計(jì)是從python語言學(xué)來的吧。
創(chuàng)建OSX應(yīng)用
創(chuàng)建一個(gè)可編輯的文本應(yīng)用
創(chuàng)建工程
- 開發(fā)語言選擇:swift
- UI選擇:storyboards
創(chuàng)建好后工程結(jié)構(gòu),默認(rèn)是一種MVC架構(gòu)的工程模式。
- AppDelegate.swift:入口程序
- ViewController.swift:視圖控制器,相當(dāng)于Controller
- Document.swift:相當(dāng)于Model
- Assets.xcassets:應(yīng)用圖標(biāo)和圖片資源庫
- Main.storyboard:UI圖形界面,相當(dāng)于View
- Info.plist:應(yīng)用設(shè)置
- swift2cocoa.entitlements:應(yīng)用發(fā)布和運(yùn)行設(shè)置
準(zhǔn)備工作
設(shè)計(jì)UI界面
打開 Main.storyboard 文件。
拖動(dòng)UI控件到設(shè)計(jì)面板上
設(shè)計(jì)視圖控制器
添加一個(gè)文本和兩個(gè)按鈕事件
import Cocoa
class 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")
}
}
連接控件
方法有很多,主要是拖動(dòng),其中一種拖動(dòng)方式如下圖所示:
另一個(gè)拖動(dòng)方式,把控件拖到controller上面
添加功能
語音朗讀
修改Controller代碼文章來源:http://www.zghlxwxcb.cn/news/detail-859446.html
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串起來文章來源地址http://www.zghlxwxcb.cn/news/detail-859446.html
Controller
import Cocoa
class 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 Cocoa
class Document: NSDocument {
override init() {
super.init()
}
enum Error: Swift.Error, LocalizedError {
case UTF8Encoding
case UTF8Decoding
var failureReason: String? {
switch self {
case .UTF8Encoding: return "File cannot be encoded in UTF-8."
case .UTF8Decoding: return "File is not valid UTF-8."
}
}
}
//文本內(nèi)容
var contents: String = ""
//自動(dòng)保存功能
override class var autosavesInPlace: Bool {
return true
}
//創(chuàng)建新文檔或打開舊文檔時(shí)調(diào)用,負(fù)責(zé)設(shè)置NSWindowController, as!是一個(gè)類型轉(zhuǎn)符,相當(dāng)于強(qiáng)轉(zhuǎn)
override func makeWindowControllers() {
let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
//因?yàn)閣ithIdentifier會(huì)返回很多不同的controller,所以這塊需要強(qiáng)轉(zhuǎn)一下
let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
//連接controller
let viewController = windowController.contentViewController as! ViewController
viewController.contents = contents
self.addWindowController(windowController)
}
//保存文檔時(shí)調(diào)用
override func data(ofType typeName: String) throws -> Data {
let windowController = windowControllers[0]
let viewController = windowController.contentViewController as! ViewController
let 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
}
}
到了這里,關(guān)于Swift-19-基礎(chǔ)入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!