zoukankan      html  css  js  c++  java
  • IOS学习之路——Swift语言(1)——基本类型、运算符与逻辑控制语句

    本人以前一直都没接触过IOS开发。大概是从年初开始,因为兴趣爱好,在慕课网上学习了最早的swift1.0课程,最近慕课网上的swift课程更新到swift2.1版本了。最近本人的mac本xcode又升级到xcode8版本了,所以swift版本也就升级到3.0了。也是因为兴趣,所以打算好好学习swift语言,毕竟这是一门新兴的编程语言,肯定是集结了各种语言的精髓从而创造出来的一门现代语言,希望自己能够跟上这个时代,学好swift,偶尔玩玩IOS开发,虽然这不是我的职业,但是作为一门兴趣爱好也是不错的,说不定以后就会派上用场呢。好记性不如写笔记,笔记可以作为日后查阅的资料,比那些正规的文档说明肯定是有优势的,查找方便,而且是自己的一个学习思路记录。

    暂时下面的swift语法是按照2.1版本记录的,有空我会更新到3.0的语法。

    最重要的是,现在只有print函数,而println函数没有啦。println()

    一、变量

    变量标识符必须以字符包括Unicode编码字符、美元字符$、下划线_开头,不能以数字开头,不能包含空格。更不能使用关键字命名。

    swift中变量的声明使用var关键字,常量的声明使用let关键字。

    1 var name="Swift";
    2 var version=2.2;
    3 let company:String="Apple";

    变量的声明:

    1. 可以使用,逗号分割变量来同时声明多个变量

    2. 可以使用:类型来同时指明多个变量的类型

    在Mac中可以使用option键来查看指定变量的类型信息,按住option键将鼠标移动到变量之上会出现?问号,点击查看。

    变量声明时不指定类型,系统会根据变量初始值来确定它的类型,这种机制叫做type inference

    3. Swift语言中采用的是Unicode字符编码,所以变量命名是可以使用中文的,也可以使用表情符号(Command+Control+Space)

    二、变量类型

    a. 整型

    整型Int分为Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64

    单纯定义一个Int类型的整数,会根据系统类型自动使用Int32或者Int64

    max和min两个属性分别表示不同位数的整数所代表的最大值和最小值。

    而整数进行运算时,如果类型不同,则需要显示进行类型转换。整型数字表示可以使用下划线_进行分割以方便代码的阅读。

    var million:Int = 1_000_000;

    给一个整型变量赋值时,可以使用二进制0b,八进制0o,十六进制0x,十进制等多种形式。

    b.浮点型

    Float, Double 区别在于Double的精度更高,一般情况下Float使用32位表示,Double使用64位表示。浮点数的表示可以使用科学计数法。

    除数不能为0,但是可以为0.0

    当正数除以0.0时结果为正无穷大,而负数除以0.0时结果为负无穷大。

    1 var a = 1.0/0.0;  // inf = infinite
    2 var b = -1.0/0.0; // -inf = - infinite
    3 var c = 0/0.0;  //nan = not a number

    tips: CGFloat

    一种Float类型值,用于IOS开发。

    1 var color:UIColor = UIColor(red: 0.2, green: 0.8, blue: 0.6, alpha: 0.8);
    2 UIColor.redColor(); //得到一个红色
    3 UIColor.greenColor(); //得到一个绿色

    A UIColor object represents color and sometimes opacity (alpha value). You can use UIColor objects to store color data, and during drawing you can use them to set the current fill and stroke colors.

    Returns a color object whose RGB values are 0.0, 1.0, and 0.0 and whose alpha value is 1.0.

     

    c.Bool布尔值类型

    类型值 true, false  注意都是小写

    在条件判断语句中,并不能使用0和1这样的数字进行条件判断,Int does not conform to protocol BooleanType

    在条件判断语句中,判断语句没有强制要求使用括号,同时逻辑语句必须用{}中括号括起来,即使只有一条语句。

     

    给某个类型指定别名使用关键字typealias

    1 typealias mytype=Int32;
    2 var count:mytype=40;

    d. 元组类型Tuple

    将不同类型的数据进行整合,从而形成一个新的数据类型。有点类似于声明一个只包含属性成员的特殊对象。元组中的每一个成员的类型可以是基本数据类型,也可以是一个新的元组类型。

    1 var person = ("zhangsan", 26, "male");
    2 var car = ("car", 120_000, ("machine", 30_000));
    3 var a : (String, Int, String);
    4 var b : (String, Int, (Float, String)) = ("company", 50, (1.0, "product"));

    定义一组变量用括号()括起来并赋予一个元组值,此时类似于元组的解包操作,用于将元组中的某一个值赋给某一个变量

    元组中数据的访问形式采用(点语法),下标索引从0开始。当然元组的最后一种声明方式是采用key-value键值对的形式

    1 var score : (chinese:Float, math:Float, english:Float, phi:Float, bio:Float) = (98.5, 105, 100.5, 95, 110);
    2 print(score.chinese);
    3 print("math=(score.math)");
    4 print(score.4);

    如果不需要关心元组中的某个值,可以使用下划线_来代替它的变量名

    1 var tuples : (x:Int, _:Int) = (5,2);
    2 tuples.x
    3 tuples.0
    4 tuples.1

    从swift2.2版本开始,元组可以进行比较。

    e. 可选类型

    数据类型关键字后面加上?表示可选类型,nil表示值缺失,表达的意思就是这个变量可以有指定类型的值,也可以是nil

    1 var age:Int = "5.5".toInt(); // 这肯定是报错的
    2 var age:Int? = "5".toInt(); // nil 值缺失

    而在可选类型变量之后使用!表示告知系统,当前已经确认该变量是有值的,不会是nil

    1 print(age); // {Some:5}
    2 print(age!); // 5

    强制类型转换!

    在Swift语言中,没有隐式转换机制,一切都需要开发者进行显示类型转换。

    f. 字符与字符串

    字符类型:单个ASCII字符,转义字符,汉字,表情符号,unicode字符u{n}n表示1到8位的十六进制数。字符必须用双引号括起来,字符的声明必须指定类型Character

    在Swift语言中,上述表现形式都是一个字符。 区别于其他语言,上述表现形式可能要用到多个字符来表示。

    字符串的创建有两种形式:

    1. 直接用双引号表示

    2. 通过String()构造器生成

    1 var ch1 = "a";
    2 var ch2 = "
    ";
    3 var ch3 = "u{22}";
    
    
    1 var str1 = "Swift";
    2 var str2 = String("Hello, Swift");
    3 var str2 = String(count: 4, repeatedValue: Character("b"));
    4 var str3 = String(count: 5, repeatedValue: UnicodeScalar("u{227}"));
    5 var emptyStr1 = "";
    6 var emptyStr2 = String();

    字符串的拼接使用+, +=, append()方法

    字符与字符串的拼接:+需要显示转换类型

    append()方法重载, 该方法会改变调用者的值

    string.append(c: Character);

    string.append(x: UnicodeScalar);

    字符串的字符个数获取使用countElements,  .characters .count

    1 var str4 = "abcd";
    2 print(countElements(str4));

    *字符串具有uft16Count属性

    *字符串具有的方法

        hasPrefix(), 

        hasSuffix(),

     

        trimmingCharacters(in: CharacterSet)

     

    *字符串插值 ()

    1 var x:Int = 2;
    2 print("(x)");

    * print语法  从Swift2.1开始支持多个参数, separater默认值是空格,terminator默认值是回车符

    1 var a = 1, b = 2, c = 3;
    2 print(a,b,c);
    3 print(a,b,c, separater:"-", terminator: "!!");

     * string.Index类型,定义在String类型的内部

     1 var str = "Hello, Swift";
     2 //var endIndex: String.Index
     3 var endIndex = str.endIndex;
     4 var startIndex = str.startIndex;
     5 str[endIndex.predecessor()];
     6 //Returns the previous consecutive value before `self`.
     7 str[startIndex.successor()];
     8 //Returns the next consecutive value after `self`.
     9 str[startIndex];
    10 //Swift2.3
    11 startIndex.advancedBy(3);

    上面一段代码在swift2.1版本是可行的,而在swift3.0版本中String.Index变化很大

    String.Index.predecessor()

    String.Index.advancedBy()

    String.Index.successor()

     

    1 var str = "Hello, Swift";
    2 var endIndex = str.endIndex;
    3 var startIndex = str.startIndex;
    4 var secondIndex = str.index(after: startIndex);
    5 var lastSecondIndex = str.index(before: endIndex);
    6 var offsetIndex = str.index(startIndex, offsetBy: 5);
    7 str[startIndex];

    * Range类型

    1 //Range<String.Index>
    2 var range = startIndex..<endIndex
    3 str[range];

    * String API

    1. replaceRange,  removeRange, removeAtIndex, insert,  append, appendContentsOf

    2.  lowercaseString, uppercaseString,  capitalizedString

    ** NSString与String

    NSString通过as关键字可以强制转换为String

    var str : String = NSString(format: "one third is %.2f " , 1.0/3.0 ) as String

    1 var nsstr:NSString = "one third is 0.333";
    2 nsstr.substringFromIndex(4);
    3 nsstr.substringToIndex(3);
    4 nsstr.substringWithRange(NSMakeRange(4, 5))

     

    三、运算符

    *    % 取余运算符  余数的符号与被除数的符号一致

    *    /   除法运算符

    整数之间进行% /获得的都是整数

    浮点数之间进行% /获得的都是浮点数

    需要强制类型转换, 同时注意正数与负数的计算结果会有不同

    同时注意到除数不能为0,但是可以为0.0

    *    单目运算符

    运算符不要与字符之间有空格

    *    区间运算符

    a. 全闭区间运算符  ...

    b. 前闭后开区间运算符  ..<

    区间运算符常常用于循环语句中,特别是循环数组时经常用到 ..< 这个前闭后开区间运算符

    tips: for in 循环语句  循环索引在循环体内部是let常量

    1 var c =[1,2,3,4,5];
    2 for i in 0..<c.count{
    3     print(i);  
    4 }

     

    四、逻辑控制语句

    for循环,语法: for init ; condition ; increase { statement } 

    while循环

    repeat while循环, 其实就是其他语言中的do while循环。只是swift中do关键字用于其他功能,因此这里使用了repeat关键字

    switch选择语句:与其他语言最大的区别在于swift中的case条件语句的末尾不再需要添加break语句。那么如何表示多个匹配结果同时执行某一种逻辑语句呢。

    那么与其他语言中书写多个case不同,swift中只需要将多个结果写在一个case语句中,并且使用逗号,进行分割。

    swith语句中的default语句不能省略掉,除非其他的case语句已经将所有可能的取值都包含进去。如何写一个空语句呢,要么使用break; 要么使用 ();

    ** switch高级用法

    switch可以针对所有的基础类型进行选择,那么case语句中的取值可以是区间0..<60 也可以是元组 (0,0)甚至忽略元组中的某个值 (_ , 0)

    fallthrough可以将选择语句的条件进行转移,即执行完上一个case语句,使用fallthrough可以开始执行下一个case语句。

     1 var point = (0,0);
     2 switch point{
     3 case (0,0):
     4     print("this is origin point");
     5     fallthrough
     6 case (_,0):
     7     print("this is a y_axis point");
     8     fallthrough
     9 case (0,_):
    10     print("this is a x_axis point");
    11 case (let x, let y):
    12     print("other point");
    13 }

    ***** case where之间配合实现模式匹配

    1 var age = 18;
    2 if case 15...20 = age where age%2==0{
    3     print("your age is between 15 and 20, and age number is odd");  
    4 }
    1 var sum = 0;
    2 for case let i in 1..<100 where i%3==0{
    3     sum+=i;
    4 }
    5 println(sum);

     ****** guard关键字

     

  • 相关阅读:
    AngularJS ui-router (嵌套路由)
    解决Can't connect to MySQL server on 'localhost' (10048)
    PHP获取一年有几周以及每周开始日期和结束日期
    MySQL(八)之DML
    MySQL(七)MySQL常用函数
    MySQL(六)之MySQL常用操作符
    MySQL(五)之DDL(数据定义语言)与六大约束
    MySQL(四)之MySQL数据类型
    MySQL(三)之SQL语句分类、基本操作、三大范式
    linux命令详解之netstat
  • 原文地址:https://www.cnblogs.com/joyjoe/p/5879754.html
Copyright © 2011-2022 走看看