Swift基础语法

  • Swift基础语法
    • 写在前面
      • 从今天开始学习Swift2016-3-16
      • 先学习简单语法不涉及详细API
      • Swift 30已经移除i方法请使用i1
    • 快捷键
    • 一些琐碎
    • 常量和变量
    • 数组和字典
    • 控制流
      • for
      • if
      • switch
      • whilerepeatwhile
    • 操作符
      • 可选值操作符
      • 范围操作符
      • 强制解包操作符
    • 函数和闭包
      • 简述
      • 一个简单函数
      • 返回多个值
      • 可变长度参数函数
      • 函数嵌套定义
      • 函数作为返回值
      • 函数作为参数传递
      • 匿名函数闭包

写在前面

从今天开始学习Swift-2016-3-16;

先学习简单语法,不涉及详细API

Swift 3.0已经移除i++方法,请使用i+=1

快捷键

//格式化代码 
ctrl+i //删除一行 
command+delete //注释一行
command+/

一些琐碎

//swift是一门安全的语言
//不支持隐式类型转换
//不支持空值,nil是一种单独的类型


//数据类型后面带有数字,表示使用几位来表示,Int8最大为127
var int8:Int8
print(Int8.max)

//二进制,八进制,16进制的表示
var two = 0b111
var eight = 0o111
var sixTeen = 0x111
print("\(two) \(eight) \(sixTeen)")

//下划线表示忽略,更清晰的数据定义方式
var bigNum = 1_000_000
var _ = 100

//轻量级的数据聚合,元组,元组可以存储任意类型的数据
//指定类型
var yuanzu0:(Int,String,Int,String) = (100,"0909",30,"222")
print("\(yuanzu0.1)")
//不指定类型,使用下标访问
var yuanzu1 = (100,"222")
print("\(yuanzu1.1)")
//标志位,访问
var yuanzu2 = (x:100,y:"aaa")
print("\(yuanzu2.x)")
//解包访问,不关心的数据可以使用_代替
var (m,_) = yuanzu2
print("\(m) ")

常量和变量

print("hello world");
//常量(let)和变量(var),未赋值的变量常量显示声明类型,赋值的变量常量会自动推断数据类型
let contast = 1;
print(contast)
var a:Int//10进制
a = 1000
var str = "this is a str"

//使用\(变量常量)可以直接打印变量常量出来
var rst = "this is a rst = \(a)"
print(rst)

数组和字典

//定义数组,使用[]访问元素
var list = [1,2,3,4,5];
print(list);
print(list[0]);

//定义字典,使用key访问
var map = ["a":1,"b":2,"c":3];
print(map);
print(map["a"])
print(map["a"]! + 100)

//如果列表和字典的类型可以被推断出来,可以不使用类型,也不用带(),在下面,shoplist首先被声明为String类型的数组,后又重新赋值,此时可以推断shoplist 是[String]
var shoplist = [String]()
shoplist = []

//跟常量和变量的定义一样,如果类型可以被推断时,可以不使用类型声明,上面的list和map类型已经可以推断,当将它重新指向空的数组和字典
list = []
map = [:]

//定义空的数组和字典
var emptyList = [String]()
var emptyMap = [String:Int]()
print(emptyList.count)
print(emptyMap.count)

控制流

for

let testList = [1,2,3,4,5,6,7,8];
//简单for循环
for var i=0;i<8;i+=1 {
    print("for this is \(testList[i])")
}
//for in 循环
//注意这里的x是常量,不能修改它的值,所以下面(1)是错误的
for x in testList{
    print("for in this is \(x)")
    //(1)
    x = 1
}

//遍历字典中的数组
let map2scan = [
    "a":[1,5],"b":["a","b","c"]
]


for (key,value) in map2scan{
     print("key is \(key)")
     for num in value{
        print("num is \(num)")
  }
}

if

//涉及可选型的概念,后面单独介绍
var optionalStr:String? = "hello"
optionalStr = "world"
print(optionalStr == nil)

var greet = "hey"

if let name = optionalStr{
    greet = "hello \(name)";
}
print(greet)

if(optionalStr != nil){
    print("optional str is not nil")
}

if score >= 10{
}

switch

//swift支持任意数据类型的switch比较,不仅限于Int和enum
//break语句,不需要显式添加,默认语句后面都会break;
//default语句,是不可以省略的,除非所有的值都被穷举出来了;
//fallthrough语句,当满足某个case之后仍旧想使它匹配下一个case,使用 fallthrough,则不会被截断
let vegetable = "red peper"
switch vegetable{
//因为每个case之后都会有break,所以每个case之后必须至少有一行可执行语句,当需要多个匹配时,可以像下面这样
case "b","B"
      print("this is b/B")
case "a":
     print("this is a")
     fallthrough
case let x where x.hasSuffix("peper"):
     print("has suffix " + x)
default:
     print("default")
}

//高级用法
//区间
let num = 100
switch num{
    case 0 ..< 100:
        print("小于100")
}

//元组
let point = (1,1)
switch point{
    case (_,0):
        print("x aliaxs");
        fallthrough
    case (0,_):
        print("y aliaxs")
        fallthrough
    case (0,0):
        print("origin point")
        fallthrough
    case (-2 ... 2,-2 ... 2):
    print("near by origin point")
}

while/repeat…while

//while/repeat...while循环,当while语句成立时,语句体会执行。
var num = 0;
while num < 100{
    num+=1
}
print("while num is \(num)")

repeat{
    num-=1;
}while num > 0
print("repeat num is \(num)")

操作符

可选值操作符(??)

//有点类似三目运算符,??表示默认值,当前面的值为空时将会使用后面的
let nickName?String = "a"
let fullName = "b"
let name = "hello \(nickName ?? fullName)"
print(name)

范围操作符(..>/…)

//提供一种更简单实现循环的方式,...包含上界

//0 1 2 3
for x in 0..<4{
    print("x is \(x)")
}

//0 1 2 3 4
for x in 0...4{
    print("x is is \(x)")
}

强制解包操作符(!)

//强制解包 unwrap 解包的概念会在可变型中介绍
var num = 100
var name = "this is " + num!

函数和闭包

简述

函数是一个可以被抽取调用的封闭代码块,是可以被传递的数据类型

一个简单函数

//函数使用func关键字命名
//使用  [参数名:参数类型]  ...的方式定义参数
//调用函数时,要用  [参数名:值]  的方式传递
//func 函数名(参数列表(参数名:参数类型))-> 返回类型  {// 函数体}
func firstFun (name:String,pwd:String,newParams:String)->Bool {
     print("name is \(name) and pwd is \(pwd)")
     return true
}
firstFun("chendong",pwd:"1234567",newParams:"new params");

返回多个值

//可以使用元组返回多个值,实际上是以元组作为值传递的方式
//使用元组实现多个返回值
//元组可以使用键访问,rst.max,也可以使用下标访问,rst.2
func getMultiBackFun(scores:[Int])->(max:Int,min:Int,sum:Int){
     var sum = 0
     var min = scores[0]
     var max = scores[0]
     for score in scores{
        sum += score;
        if(score > max){
             max = score;
         }
        if(score < min){
          min = score
        }
     }
     return (max,min,sum)
}
let rst = getMultiBackFun([4,8,1,0,7])
print("max is \(rst.max) min is \(rst.min) sum is \(rst.sum) rst.2 is \(rst.2)")

可变长度参数函数

//跟所有的语言一样,支持可变长度参数,本质是数组的传递
//一个求均值的函数
func changeParamFun(params :Int...)->Void{
     var sum = 0;
     for x in params{
         sum+=x
     }
     print("averge is \(sum/(params.count))")
}

changeParamFun(1,4)
changeParamFun(0,9,7)

函数嵌套定义

//函数可以嵌套定义,被嵌套的函数作用域有限,只能在嵌套它的{}中被访问,比如下面(1)中的代码是编译错误的,被嵌套的函数可以访问外面函数的变量或者全局变量,
func aOutFun() -> Void{
            var num = 100
            func aInFun()->String{
                return "chendong \(num)"
            }
            print(aInFun())
}
aOutFun()
//1 编译错误
aInFun()

函数作为返回值

//函数作为返回值,下面的函数表示一个无参函数,返回值是一个(参数为Int,返回值是String的)函数类型,在函数returnFuncFun中定义内嵌函数并返回,在外部可以使用该函数
func returnFuncFun()->(Int->String){
     func INTSTRING(num:Int)->String{
          return "this num is \(num)"
     }
     return INTSTRING
}
let funINTSTR = returnFuncFun();
print("func return is \(funINTSTR(1000))")

函数作为参数传递

//函数作为参数,下面的函数表示一个参数为Int类型,一个参数为(Int->String)的函数类型,返回值String
func funParamFun(num:Int,param : Int -> String)->String{
     return "funparamfun + \(param(num))"
}

func paramFunc(num:Int)->String{
     return "paramfunc + \(num)"
}

print("rst is \(funParamFun(100,param: paramFunc))")

//结果是  rst is funparamfun + paramfunc + 100

匿名函数闭包

//匿名闭包(in 前面是参数类型,in后面的是函数体)
let numbers = [1,5];
let get = numbers.map({
    (in 前面是函数参数和返回值,in后面的是函数体)
    (number:Int)->Int in
    let rst = number*2;
    return 3 + rst;
})
print("rst is \(get)")

//如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回.
numbers.map({
    number in number * 3
})

//使用参数位置代指参数       
numbers.sort({$0>$1})
let get2 =  numbers.map({$0*2})
print("numbers is \(get2)")

Swift基础语法的更多相关文章

  1. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5原创俄罗斯方块(基于canvas)

    这篇文章主要介绍了Html5原创俄罗斯方块(基于canvas)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  4. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  5. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  6. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  7. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  8. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

  9. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  10. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部