代码和人有一个能跑就行
教程目录
与OC一样的内容不重复介绍
基础知识
2020.07.04(第一更)
一.常量和变量
1.声明常量
/// 常量
func letWithVar() {
//定义常量使用let关键字,常量只能被赋值一次
let letNum = 90;
//letNum = 80;
//像这种声明常量但暂不指定值的需要指定存储的类型才行,这叫类型注解,下面会有介绍
let letNumOne : Int8;
letNumOne = 38;
//声明多个相同类型的常量,只需要在最后进行类型注解
let q,w,e : Int8;
}
2.声明变量和常量的方式一模一样,区别是变量可以改变值
二.类型注解
/// 类型注解
func typeAnnotation(str: String) {
//当你声明常量或者变量的时候可以加上类型注解(type annotation),说明常量或者变量中要存储的值的类型。
//如果要添加类型注解,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
//在声明常量或者变量时如果直接赋值的话不需要进行类型注解,因为编译器会根据赋值的内容自动推断.
var s: String;
s = "声明的时候是字符串只能接收字符串类型";
var str = "str是字符串类型,直接赋值可以不注解";
var num = 12;
var numTemp: Int8;
numTemp = 12;
let letNum: Int8;
letNum = 12;
let letNumTemp = 12;
//方法中有传参数,必须使用注解,比如当前的方法
}
三.常量和变量的命名
一句话别整花里胡哨的,使用英文驼峰命名法.
四.整数转换
///类型转换
func typeConversion(){
let num8: Int8 = 12;
let num16: Int16 = 123;
//let result = num16 + num8;这样会报错因为类型不同不可操作
//将低类型转为高类型即可
let result = num16 + Int16(num8);
print(result);
}
float和其他的同理SomeType(ofInitialValue)
五.类型别名
类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用 typealias 关键字来定义类型别名。个人不建议这么做,尤其是多人开发时.
//将UInt16重命名
typealias AudioSample = UInt16;
let num: AudioSample = 123;
六.布尔值
//声明布尔值
var bool : Bool;
bool = true;
var testBool = true;
七.元组
元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
/// 元组
func tuples(){
//元组里面可以存储任意的类型
//定义一个元组
let tuplesTest = (123,"123123");
//取元组里面的值使用,需要给元组中的内容命名
let (status,content) = tuplesTest;
print(status,content);
let tuplesTemp = (status,content);
print(tuplesTemp.0,tuplesTemp.1);//这种不建议,可读性太差
//还有一种方式就是在定义元组的时候给对应的内容命名
let tuplesTempOne = (statusOne:123,statusTwo:"测试内容");
print(tuplesTempOne.statusOne,tuplesTempOne.statusTwo);//可读性强
//元组作为返回值
let (statu,alert,page) = returnTuples();
print(statu,alert,page);//完美
}
func returnTuples() -> (Int16,String,Int8) {
let httpStatus = (status:Int16(404),alert:"找不到网页",page:Int8(12));
return httpStatus;
}
挺强大的功能,但是如果数据过于复杂就不建议使用了
八.可选类型
可选类型在这里面算是新加的了,OC里面是没有这个的,但看字面意思很难联想到他能做什么,所以仔细研究了一下,其实也很简单,看下面
可选类型:因为Swift是类型安全的语言,什么意思呢?举个例子,比如说之前使用OC写代码时可能会出现对象是nil的情况,但是编译的时候系统是不会提示我们的,如果我们不对对象进行判断直接使用nil对象结果就是程序容易出现崩溃,因此为了解决这个问题Swift就发明了可选类型,让你在编译的过程把所有可能出现nil的情况全都给你提示让你全部处理掉,你不处理就给你报错,你说是不是很安全了.
首先说一下nil这个东西,在OC中nil表示空对象大家都知道,但是Swift中nil表示的是值,是一个告诉我们对象缺失的值.
通过上面的总结大家应该理解了为什么要使用可选类型和nil是什么东西,接下来就说一下可选类型的概念及使用.
概念:被声明为可选类型的常量或变量要么有具体的值要么没有值返回的是nil,如果没有使用可选类型那么是不能使用nil的.可选类型的标志是?
func optionalsTest() {
//定义一个可选字符串,optionalStr可以为nil
var optionalStr: String?;
//定义一个可选Int,optionalInt可以为nil
var optionalInt: Int?;
//nil代表的值缺失,optionalStr和optionalInt现在都是nil
}
强制解析
->2020.07.05(第二更)
可选对象是枚举类型,可选类型的对象必须进行解包才能使用.
/// 可选类型
func optionalsTest() {
//定义一个可选字符串,optionalStr可以为nil
var optionalStr: String?;
//定义一个可选Int,optionalInt可以为nil
var optionalInt: Int? = 12;
//nil代表的值缺失,optionalStr和optionalInt现在都是nil
//强制解析,在变量或常量后面加'!',对可选对象进行强制解析即可使用其值
//但是需要判断可选对象是否为nil,不检测的话如果值为nil,那么会报错
if optionalInt != nil {
NSLog("optionalInt有值,可以进行强制解析,值为:%d", optionalInt!);
}else{
NSLog("optionalInt无值,不可以进行强制解析,进行强制解析会崩溃!");
}
}
可选绑定
可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。
func optionalsTest() {
//定义一个可选字符串,optionalStr可以为nil
var optionalStr: String?;
//定义一个可选Int,optionalInt可以为nil
var optionalInt: Int? = 12;
//nil代表的值缺失,optionalStr和optionalInt现在都是nil
//可选绑定,不要看名字,看下面的用法(名字起的真好...)
if let optionalS = optionalStr {
NSLog("%@", optionalS);
}else{
print("optionalStr是nil");
}
//上面的代码的意思就是如果optionalStr这个可选对象不是nil的话,就将optionalStr里面存储的值 赋值给optionalS,不需要进行解包操作了,可以直接使用optionalS
//可以使用let也可以使用var,下面的是且的关系,都为真才为真
if let optionalS = optionalStr , var optionalI = optionalInt {
print("optionalStr和optionalInt都有值");
} else {
print("optionalStr或optionalInt有一个或者都是nil");
}
}
隐式解析可选类型
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。那么什么时候使用隐式解析可选类型呢?答案只有一个,当我们确定我们定义的这个可选类型肯定一直有值就可以使用隐式解析可选类型.
//隐式解析可选类型
//举个我定义了一个常量str而且初始化了值,所以我确定在接下来的使用过程中str这个可选类型肯定有值,这个时候就可以使用隐式解析可选类型,即将?替换为!
let str: String! = "123";
//下面使用时就不需要进行解包操作,可以直接使用
let strT:String = str+"asd";
print(strT);
print(str+"asd");
如果一个变量在使用过程中有可能是nil,不要使用隐式解析可选类型.具体原因自己细品.
错误处理
说白了就是方法调用过程中程序出现问题,需要告诉调用者出事了,曾经看到有人说有if用这个干吗?打个简单的比方,你写了一个工具类,别人只需要调用你的方法就行,不需要知道内部的实现,但是出错了你还得告诉调用者,你会用什么办法?当然办法很多,但是使用try catch不是最省事最简单的吗?好了不多说上代码
//
// ViewController.swift
// SwiftCourse
//
// Created by 九天 on 2020/6/30.
// Copyright © 2020 九天. All rights reserved.
//
import UIKit
enum CarError:Error {
case CarErrorNoIll
case CarErrorNoMoney
case CarErrorNoPeople
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white;
errorHandle();
// Do any additional setup after loading the view.
}
//错误处理
func errorHandle(){
do {
try buildCar();
print("没毛病造车成功");
} catch CarError.CarErrorNoIll {
print("没油");
} catch CarError.CarErrorNoMoney{
print("没钱了");
} catch CarError.CarErrorNoPeople{
print("没人买");
}catch{
print("未知错误");
//这个空的catch必须要加上,不然会报错
}
}
func buildCar() throws{
throw CarError.CarErrorNoMoney;
}
}
基础知识更新完毕,更多精彩内容见目录本文完整代码地址
本文中的总结
1.swift可以省略分号,但是个人还是不习惯,所以本文未省略
2.可以使用print(letNum);进行输出内容,比NSLog省事
3.使用数字值时根据情况使用Int8,Int16,Int32,Float32等.因为他们占用的内存是不一样的.前提是你可以确定值的长度.
let minValue = UInt8.min // minValue 为 0,是 UInt8 类型
let maxValue = UInt8.max // maxValue 为 255,是 UInt8 类型
4.Int长度和机器本身是相同的,32的机器上Int代表的是Int32,64的机器上是Int64
5.swift中布尔值抛弃了之前YES和NO的形式,更严谨了
6.swift中对比使用==
或者!=
字符串也是如此
7.swift中if语句判断时不需要小括号了
8.swift中字符串不需要@
符号了