文档章节

Swift笔记-让你2小时学会Swift

程序员孟帅
 程序员孟帅
发布于 2016/02/10 15:11
字数 2364
阅读 1.3W
收藏 428

过年不能闲着,一边学习Swift,一边写笔记,相信在有一定其他语言基础的情况下用1.5小时看完该文章即可掌握。然后再花30分钟打开XCode写个Demo.
生命中拿出2小时来认识一门语言,很值吧!
笔记共分为两部分,一Swift基础知识,二使用Xcode开发一个软件
[TOC]

swift基础知识

变量和常量

//定义变量
var myVariable = 123

//定义常量
let myConstantVariable = 123

// 隐式指定整数类型
var anInteger = 2

// 明确指定整数类型
let anExplicitInteger :Int = 2

元组

let aTuple = (1, "Yes")
let anotherTuple = (aNumber: 1, aString: "Yes")
let theOtherNumber = anotherTuple.aNumber  // = 1

其他用法

let http404Error = (404, "Not Found")
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")

更多用户函数返回值,返回两个以上的值,跟golang很像

数组

var arrayOfIntegers : [Int] = [1,2,3]
// 隐式指定
var implicitArrayOfIntegers = [1,2,3]

// 也可以创建空数组,但必须提供其类型
let anotherArray = [Int]()

//使用 append 函数向数组的末尾追加对象
myArray.append(4)

//数组中的任意位置插入对象
myArray.insert(5, atIndex: 0)


字典

字典是一种将键映射到值的类型,类似Java的Map,PHP的数组

 var crew = [
          "Caption": "Jean-Luc Picard",
          "First officer": "William Riker",
          "Second Officer": "Data"
];


crew["Captain"]
// = "Jean-Luc Picard"

控制流

if

 if 1+1 == 2 {
         println("The math checks out")
}

for-in

let loopingArray = [1,2,3,4,5]
var loopSum = 0
for number in loopingArray {
     loopSum += number
}
loopSum // = 15

var firstCounter = 0
     for index in 1 ..< 10 {
         firstCounter++
     }
// 循环9次

var secondCounter = 0
for index in 1 ... 10 { // 注意是三个句点,不是两个
         secondCounter++
     }
// 循环10次

var sum = 0
for var i = 0; i < 3; i++ {
    sum += 1 
}
sum // = 3

while

var countDown = 5
while countDown > 0 {
     countDown--
}
countDown // = 0
var countUP = 0
do {
         countUp++
} while countUp < 5
countUp // = 5

if-let

可以用 if-let 语句检查一个可选变量是否包 含值。如果包含,则将这个值指定给一个常量变量,然后运行某段代码。这样可以减少很 多行代码,同时又能够保证安全性

var conditionalString : String? = "a string"
     if let theString = conditionalString? {
         println("The string is '\(theString)'")
     } else {
         println("The string is nil")
}
// 输出 "The string is 'a string'"

函数

单返回值简单函数

两个参数一个返回值,都为Int

func thirdFunction(firstValue: Int, secondValue: Int) -> Int {
         return firstValue + secondValue
     }
thirdFunction(1, 2)

使用元组多返回值

func fourthFunction(firstValue: Int, secondValue: Int)
         -> (doubled: Int, quadrupled: Int) {
         return (firstValue * 2, secondValue * 4)
     }
fourthFunction(2, 4)

// 用数字访问:
fourthFunction(2, 4).1 // = 16

// 其他相同,只是使用了名字:
fourthFunction(2, 4).quadrupled // = 16

外部名称调用

在定义函数时,可以为参数指定名字。当无法马上明白每个参数的用途时,这一功能会非 常有用。可以像下面这样来定义参数名字:

func addNumbers(firstNumber num1 : Int, toSecondNumber num2: Int) -> Int {
         return num1 + num2
}
addNumbers(firstNumber: 2, toSecondNumber: 3)  // = 5

在为参数创建名字时,就是为参数创建一个内部名字和一个外部名字,一个参数的内部名字应当与外部名字相同。将同一个名字输 入两次也没有什么问题,但的确有一种简便的方式来定义一个外部名字与内部名字相同的 参数——就是在参数名之前放一个 # 符号

func multiplyNumbers(#firstNumber: Int, #multiplier: Int) -> Int {
         return firstNumber * multiplier
}
multiplyNumbers(firstNumber: 2, multiplier: 3)  // = 6

将函数用作变量

var numbersFunc: (Int, Int) -> Int;
// numbersFunc现在可以存储任何接受两个Int并返回一个Int的函数

numbersFunc = addNumbers
numbersFunc(2, 3) // = 5

闭包closure

sort需要传递一个闭包作为参数

var numbers = [2,4,34,6,33,1,67,20]
var numbersSorted = numbers.sort( { (first, second ) -> Bool in
    
    return first < second
})

闭包只包含一行代码,可以省略 return 关键字

var numbersSorted = numbers.sort( { $1 > $0})
print(numbersSorted)

如果一个闭包是函数调用中的最后一个参数,可以将它放在括号外面。这纯粹是为 了提高可读性,不会改变闭包的工作方式

var numbersSorted = numbers.sort(){ $1 > $0}
print(numbersSorted)

闭包放在变量里面

var comparator = {(a: Int, b: Int) in a < b}
comparator(1, 2)  // = true

对象

定义

class Vehicle {
    var color: String?
    var maxSpeed = 80
    func description() -> String {
        return "A \(self.color) vehicle"
    }
    func travel() {
        print("Traveling at \(maxSpeed) kph")
    }
}

使用

var redVehicle = Vehicle()
redVehicle.color = "Red"
redVehicle.maxSpeed = 90
redVehicle.travel() // 输出"Traveling at 90 kph" redVehicle.description() // = "A Red vehicle"

继承

要重写一个函数,要在子类中重新声明它,并添加 override 关键字

class Car: Vehicle {
// 继承类可以重写函数
             override func description() -> String {
                 var description = super.description()
                 return description + ", which is a car"
} }

在一个被重写的函数中,可以通过 super 回调该函数在父类中的版本

override func description() -> String {
         var description = super.description()
         return description + ", which is a car"
}

初始化与反初始化


class InitAndDeinitExample {
    // 指定的初始化器(也就是主初始化器)
    init() {
        print("I've been created!")
    }
    // 便捷初始化器,是调用上述指定初始化器所必需的
    convenience init (text: String) {
        self.init() // 这是必需的
        print("I was called with the convenience initializer!")
    }
    // 反初始化器
    deinit {
        print("I'm going away!")
    }
}

var example : InitAndDeinitExample?
// 使用指定的初始化器
example = InitAndDeinitExample() // 输出"I've been created!"
example = nil // 输出"I'm going away"
// 使用便捷初始化器
example = InitAndDeinitExample(text: "Hello")
// 输出"I've been created!"
// 然后输出"I was called with the convenience initializer"

创建一个可以返回 nil 的初始化器(也称为可以失败的初始化器),就在 init 关键字的后面放上一个问号,并在初始化器确定它不能成功地构造该对象时,使用 return nil:

convenience init? (value: Int) {
    self.init()
    if value > 5 {
        // 不能初始化这个对象;返回nil,表示初始化失败 return nil
    } }

在使用一个可以失败的初始化器时,任何可以在其中存储该结果的变量都是可选的:

let failableExample = InitAndDeinitExample(value: 6)
// = nil

协议

使用协议的好处是,可以利用 Swift 的类型体系来引用任何遵守某一给定协议的对象,个人现在理解为是Interface概念。

protocol Blinking{
    var isBlinking:Bool{get}
    var blinkSpeed: Double { get set }
    func startBlinking(blinkSpeed: Double) -> Void
    
}

class Light:Blinking{
    var isBlinking = false
    var blinkSpeed = 1.2
    func startBlinking(blinkSpeed: Double) {
            print("now my speed is \(self.blinkSpeed)")
    }
    
}

扩展

 extension Int {
         var doubled : Int {
             return self * 2
         }
         func multiplyWith(anotherNumber: Int) -> Int {
             return self * anotherNumber
} }

2.doubled  // = 4
4.multiplyWith(32) // = 128

还可以利用扩展使一个类型遵守一个协议

extension Int : Blinking {
    var isBlinking : Bool {
        return false;
    }
    var blinkSpeed : Double {
        get {
            return 0.0; }
        set {
            // 不做任何事情
        } }
    func startBlinking(blinkSpeed : Double) {
        print("I am the integer \(self). I do not blink.")
    } }
2.isBlinking // = false
2.startBlinking(2.0) // 输出"I am the integer 2. I do not blink."

访问控制

在将一个方法或属性声明为 public 时,App 中的所有人都能看到它:

// 可供所有人访问
public var publicProperty = 123

//如果将一个方法或属性声明为 private,那只能在声明它的源文件内部看到它:
// 只能在这个源文件中访问
private var privateProperty = 123

// 仅能供本模块访问
// 这里的'internal'是默认的,可以省略 
internal var internalProperty = 123

运算符重载

类似C++的运算符重载

class Vector2D {
    var x : Float = 0.0
    var y : Float = 0.0
    init (x : Float, y: Float) {
        self.x = x
        self.y = y
    }
   
}
func +(left : Vector2D, right: Vector2D) -> Vector2D {
    let result = Vector2D(x: left.x + right.x, y: left.y + right.y)
    return result
}

let first = Vector2D(x: 2, y: 2)
let second = Vector2D(x: 4, y: 1)
let result = first + second

泛型

Swift与Java泛型相同

class Tree <T> {
    // 'T'现在可以用作一种类型 var value : T
    var value:T
    var children : [Tree <T>] = []
    init(value : T) {
        self.value = value
    }
    func addChild(value : T) -> Tree <T> {
        var newChild = Tree<T>(value: value)
        children.append(newChild)
        reutrn newChild
    }
}


// 整数树
let integerTree = Tree<Int>(value: 5)
// 可以增加包含Int的子树 
integerTree.addChild(10)
//用Swift设计程序 | 45
integerTree.addChild(5)
// 字符串树
let stringTree = Tree<String>(value: "Hello")
stringTree.addChild("Yes")
stringTree.addChild("Internets")

字符串

比较字符串

  let string1 : String = "Hello"
     let string2 : String = "Hel" + "lo"
     if string1 == string2 {
         println("The strings are equal")
  }

查找字符串

 if string1.hasPrefix("H") {
         println("String begins with an H")
     }
     if string1.hasSuffix("llo") {
         println("String ends in 'llo'")
     }

数据

let stringToConvert = "Hello, Swift"
let data = stringToConvert.dataUsingEncoding(NSUTF8StringEncoding)

Swift with cocoa用Xcode开发软件

打开Xcode 7.2

STEP1

打开Xcode新建Project选择OSX Application

STEP2

STEP3

打开Main.storyboard,在ViewController中拖入Label

STEP4

修改ViewController.swift代码

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var timestamp:NSTextField!
    @IBOutlet weak var dateLabel:NSTextField!
    @IBAction func calc(sender:NSButton){
        
        //将输入的字符串转为NSString
        let string = NSString(string: self.timestamp.stringValue)
        
        //转为double类型
        let ts:NSTimeInterval = string.doubleValue
        
        //转换日期
        let date = NSDate(timeIntervalSince1970: ts)
        
        //日期格式化
        let dfmatter = NSDateFormatter()
        dfmatter.dateFormat="yyyy年MM月dd日"
        
        //显示到Label
        dateLabel.stringValue = dfmatter.stringFromDate(date)
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

上述的NSTextField后面的叹号,它被称为隐式拆封的可选类型,是一种特殊类型,指出变量可能有值,也可能为nil。Swift运行 环境不喜欢访问值为nil的变量,因此Swift程序员必须知晓变量的值,尤其在其可能为nil时。
将变量声明为隐式拆封的可选类型相当于告诉Swift编译器,你承诺在该变量的值为nil时绝 不会访问它。这是你与编译器签订的一个合约,你必须遵守。如果你不遵守,在变量为nil时访 问它,将引发运行阶段错误,导致应用程序停止运行

另外也可以开启两个视图直接拖入例如:
Snip20160212_1

STEP5

链接UI与代码部分,将TextField右键,选择new referencing Outlets点加号指向ViewController,在弹出的选项里面选择timestamp,同样方式选择到label上。
Snip20160210_15

绑定按钮的click事件
Snip20160210_16

STEP6

点击上方的三角箭头运行程序

Snip20160210_17

© 著作权归作者所有

程序员孟帅
粉丝 69
博文 16
码字总数 27021
作品 0
CEO
私信 提问
加载中

评论(20)

crossmix
crossmix
安装Mac虚拟机可以,但你的电脑内存要很高
crossmix
crossmix
好,good
JimStone
JimStone
两小时纯粹扯淡,swift的所有语言特性要真学会到使用,起码要2天,一般语言2小时都是正常时间
Glitter
Glitter
继续完善哈~加油
榕树下_
榕树下_
这好
RenKaidi
RenKaidi
mark
码农肖恩
码农肖恩
很好,学习了。
刘柳
刘柳
赞一个
小麦克
这个不错,有其他语言的基础,最需要这种概括性的教程。一般的教程为了照顾初学者,搞的太啰嗦
l
lxgy
我也想开发一个新编程语言
Swift 3 新特性和迁移详解

写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0。所以写点小总结。 背景 代码量(4万行) 首先,我是今年年初才开始入手 Swift 的。加...

肖品
2016/10/14
0
0
我是直接学Swift还是Objective-C?

当我们发布了Swift语言学习课程之后,收到了很多邮件和私信来问自己是否还需要学习C或者Objective-C。此外,人们似乎还在迷惑Swift到底适合iOS开发生态中的哪些部分。通过这篇文章,我希望能...

程序袁_绪龙
2014/09/25
323
3
【译】Swift算法俱乐部-为什么要学习算法与数据结构?

本文是对 Swift Algorithm Club 翻译的一篇文章。 Swift Algorithm Club是 raywenderlich.com网站出品的用Swift实现算法和数据结构的开源项目,目前在GitHub上有18000+⭐️,我初略统计了一下...

Andy_Ron
2018/09/16
0
0
宏碁笔电开始采用AMD Ryzen 4000移动处理器 519美元起售

宏碁宣布将在今年发布其Aspire 5笔记本电脑的新版本,该笔记本电脑将采用AMD的Ryzen 5 4500U移动芯片。该公司还透露了其搭载Ryzen处理器Swift 3的发布日期。 宏碁的目标是通过两条生产线以合...

稿源:
03/30
0
0
Swift 学习笔记1- Hello world

Hello world 在开始写这篇博客的时候,我没用过Objective C,正在学习Swift,所以在这个过程中会犯一些和基础的错误,写博客的目的主要是为了辅助学习,所以当您在骂我“不懂就别瞎鸡吧写,简...

喂码呢
2014/08/11
54
2

没有更多内容

加载失败,请刷新页面

加载更多

activiti 工作流数据库表详细介绍(23张表)

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。 ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和...

osc_2gaqqnhg
12分钟前
20
0
【Python3 爬虫】U34_selenium操作cookie

目录 1.示例代码 2.实战演练 1.示例代码 获取所有的cookie:for cookie in driver.get_cookies(): print(cookie) 根据cookie的key获取value: value = driver.get_cookie(key) 删...

osc_we9lokaj
14分钟前
10
0
【Python3 爬虫】U35_selenium隐式等待和显示等待

目录 1.隐式等待 2.显示等待 3.实战演练 3.1 隐式等待案例 3.2 显示等待案例 现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长...

osc_2wq8ft8d
15分钟前
16
0
一文读懂 K8s 持久化存储流程

作者 | 孙志恒(惠志) 阿里巴巴开发工程师<br /> **导读:**众所周知,K8s 的持久化存储(Persistent Storage)保证了应用数据独立于应用生命周期而存在,但其内部实现却少有人提及。K8s 内...

阿里巴巴云原生
16分钟前
23
0
为什么大公司一定要使用微服务?

作者:飒然Hang https://www.rowkey.me/blog/2019/05/30/msa/ 这几年在 Java 工程师招聘时,会看到很多人的简历都写着使用了 Spring Cloud 做微服务实现,使用 Docker 做自动化部署,并且也会...

Java技术栈
16分钟前
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部