Swift学习笔记之集合类型

集合分三种,Array,Set,Dictionary。

  • Array 像JS的Array ,可以放key.
  • Dictionary 对应Java的Map

数组操作

创建空的数组

var ints = [Int]();
print(ints.count);

添加数据

var ints = [Int]();
ints.append(3);
ints += [3];
print(ints);

置空

var ints = [Int]();
ints.append(3);
ints = []; //置空
print(ints);

初始化数组

var ints = Array(repeating: 2, count: 4);//重复2,重复4遍
print(ints);

数组合并

var ints = Array(repeating: 2, count: 4);//重复2,重复4遍
var otherInts = Array(repeating: 3, count: 3);
var together = ints + otherInts;
print(together);

插入某个位置

var ints = Array(repeating: 2, count: 4);
ints.insert(12, at: 1);
print(ints);

移除最后一个元素

var ints = [2,3,4,5];
ints.removeLast();
print(ints);

循环获取数组

var ints = [2,3,4,5];
for myInt in ints{
    print(myInt);
}

循环获取数组值包含index

var names = ["Tomas","HaliPoTe"]
for(index,name) in names.enumerated(){
    print("index:\(index) name:\(name)");
}

设置数组的值

var ints = [2,3,4,5];
ints[0] = 10086; //设置0位的值
ints[1...2] = [1007,1008,300]; //设置1到2的值,同时把300插入到后面
print(ints);

集合

NOTE
Swift’s Set type is bridged to Foundation’s NSSet class.
For more information about using Set with Foundation and Cocoa, see Using Swift with Cocoa and Objective-C (Swift 3).

基本数据类型例如Int 这些,已经实现了hashable ,如果是自己的类型必须要自己实现hashable ,和Java重写hashvalue方法感觉差不错

操作

//创建一个空的集合
var emptySet  = Set<String>();
//创建并同时初始化集合
var myfavorice: Set<String> = ["苹果","荔枝","西瓜"];
//添加元素
myfavorice.insert("李子");
//置空
myfavorice = [];
//根据类型自动匹配创建
var sex:Set = ["男","女"];
//remove
myfavorice.remove("苹果");
//迭代
for name in myfavorice{
    print(name);
}
//集合操作
var classA:Set<String> = ["哆啦A梦","静香","小夫"];
var classB:Set<String> = ["哆啦A梦","大熊","小夫"];
//交集
print("交集:\(classA.intersection(classB))");
//对称差
print("对称差:\(classB.symmetricDifference(classA))");
//并集
print("并集:\(classA.union(classB))");
//差集
print("差集:\(classA.subtracting(classB))");
//相等
print(classB == classA);

let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱","鸡"]
let cityAnimals: Set = ["够"]
//是不是farm 的子集
print(houseAnimals.isSubset(of: farmAnimals));
//farm的超集是不是house
print(farmAnimals.isSuperset(of: houseAnimals));
//是否没有任何的交集
print(farmAnimals.isDisjoint(with: cityAnimals));

Swift学习笔记之字符和字符串

就是字符串和字符,没什么好说的

字符串操作

循环获取字符

var name = "Tomas";
for letter in name.characters{
    print(letter);
}

字符数组创建字符串

let cat : [Character] = ["m","y","c","😂"];
let catStr = String(cat);
print(catStr);

字符插入


let name = "Tomas";
var say = "my name is \(name)";
print(say);

计算字符数

let sayHello = "Hello 大家好,我是梁胖子";
print("say hello lenght:\(sayHello.characters.count)")

下标获取字符

let name = "Tomas!";

print(name[name.startIndex]);
print(name[name.index(before: name.endIndex)]);
print(name[name.index(name.startIndex, offsetBy: 4)])

Swift笔记之操作符

支持大部分C语言的操作符,但是又有不同

  • “=” 不返回任何值,避免了和==号混淆
  • 提供两个范围操作符(a..<b and a...b)
  • 与Java不同,支持操作符重载

其他地方都和Java或者C没什么不一样

特殊地方

支持元素块比较

(1, "zebra") < (2, "apple")   // true because 1 is less than 2
(3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"
(4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"

Swift笔记之基础

声明一个变量

var name = "我是客服";

申明一个常量

let youName = "不是客服";
youName = "你才是客服"; //将会编译不通过

打印

print("string");
//打印字符串
var name = "tomas";
print("my name is \(name)");

//打印整数
var age = "12";
print("my age is \(age)");

分号

Swift 不一定需要分号,在一行中写两句代码才需要

let name = "cat"; var age = 12;
//不需要分号写法
let name = "cat"
var age = 12

整形

Swift 提供8 ,16,32和64位整形和无符号整形,命名方法和C相似,8位无符号为UInt8,32位为Int32.

获取最大最小值方法

let minUInt = UInt8.min
let maxUInt = UInt8.max

Int & UInt

  • 在32位平台上,Int 就是32位的
  • 在64位平台上,Int 就是64位的

浮点类型

  • Double 相当于64位的浮点类型
  • Float 相当于32位的浮点类型
    *
    ### Swift是类型安全和类型推断的
var age = 12;
age = "Tomas"; //这行是编译不通过的,age 已经推断为Int型,无法赋值String类型

数字样式

  • 十进制 没有前缀
  • 二进制 0b开头
  • 八进制 0o开头
  • 十六进制 0x开头

科学计数法

十进制

  • 1.25e2 -> 1.25 x 102 or 125.0.
  • 1.25e-2 -> 1.25 x 10-2 or 0.0125.

十六进制

  • 0xFp2 -> 15 x 22, or 60.0.
  • 0xFp-2 -> 15 x 2-2, or 3.75.

12.1875的多种写法

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

还可以增加一些额外的格式来使数字更容易看懂

let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

强行转换

let a = 12.9;
var b: Int = Int(a);

类型别名

就是和C++一样,可以吧Int改为另外一个名字

typealias AudioSample = UInt16;
var maxAmplitudeFound = AudioSample.min;

布尔类型

Swift 有个基本数据类型Bool, 取值true or false

let orangesAreOrange = true
let turnipsAreDelicious = false

元组

装包

let http404Error = (404, "Not Found");
//http404Error 类型就是(Int,String) 类型

拆包

var http404NotFound = (404,"NOT FOUND");
var (code,message) = http404NotFound;
print(code,message);

部分拆包

var (code,_) = http404NotFound;

直接通过下标去访问

print(http404NotFound.0,http404NotFound.1);

还可以直接通过key访问,像Map一样

var http500 = (code : 500,message:"Sever Error");
print(http500.code,http500.message);

optional(可选项)

思考以下代码,convertedNumber 是optional Int 还是 Int

let possibleNumber = "123";
let convertedNumber = Int(possibleNumber);

由于posssibleNumber 并不是一定是可以转换为Int类型的,当不能返回的时候就是nil,所以应该是optional Int 对象。

nil

你可以给一个可选类型设置nil值

var version: Int? = nil;
print(version)

非可选类型是不可以给一个nil值的,只有可选类型才可以

直接定义个可选类型默认就是nil赋值

var version: Int?;
print(version) ;//为nil

和OC上的nil并不是一样的,Swift上的只是实际值不在的时候一个确定的赋值类型,并不仅仅用于对象,所有类型都是可以的

if 语句以及强制解析

判断可选类型中是否有值

if containAValue != nil{
    //do something
}

使用可选类型

if containAValue != nil{
    print("\(containAValue!)");
}

使用"!"强制使用可选类型的时候必须确定部位nil,不然将会出现错误

可选绑定

var name : String? = "test";//name 不为nil时将会执行
if let myName = name{
    print(myName);
}

错误处理

错误处理写法

do {
    try canThrowAnError()
    // no error was thrown
} catch {
    // an error was thrown
}