swift常用语法

引用链接

(一)类型

常见类型

Int,String,Double,struct,enum,class,tuple

//typle 元组类型

//声明

let someTuple:(Int,Int) = (10,23)

//元组可以设置名称

var person = (name:"liuyw",age:30)

//取值方式1

person.0

person.1

//取值方式2

person.age

person.name

//取值方式3

var (personName,personAge) = person

personName

personAge

someTuple.0或者tuple.1

//typealias

//类型的别名关键字

//函数类型

func

//可选类型

var num:Int? = nilvar num1:Optional= nil

//隐式解析可选

var num:Int!var num1:ImplicitlyUnwrappedOptional

//协议合成类型

var someProtocol:protocol

数组 Array

//声明

var array1:[String] = ["0","1","2","3"]

var array = [String]()

//修改值

array1 += ["4","5"]

array1[1...3] =["a","b","c","d","e"]

//array1.append

//array1.removeAtIndex()

//array1.insert(, atIndex:)

//获取值

print(array1)

print(array1[0])

print(array1.last)

print(array1.first)

var str:String = ""

//遍历

for item:String in array1{

}

for bgen in array1.enumerate()

{

print("元素下标:\(bgen.0)  元素值:\(bgen.1)")

}

字典 dictionary

//声明

var dic:Dictionary= ["name":"liu","age":"30"]

var dic1 = Dictionary()

//修改值

dic["name"] = "liuyanwei"

dic["name1"] = "liuyanwei1"

dic.updateValue("liuyw", forKey: "name")//返回原值

dic1.indexForKey("name1")

dic.removeValueForKey("name")

//获取值

dic["name"]

//字典的循环

for (key,value) in dictionary{

println("key is: \(key) value is : \(value)");

}

枚举 enum

//整形的枚举

enum Sharp:Int{

case Rect=1,Circle,Star

//switch中的选项可以用.表示

func desc()->String{

switch self{

case .Rect:

return "this is rect"

case .Circle:

return "this is circle"

case .Star:

return "this is star"

}

}

}

//enum的值

Sharp.RawValue(1)

//调用枚举的方法

Sharp.Rect.desc()

结构 struct

//结构

//结构和类的最重要的区别就是架构是传值,类是传引用

struct Sharp{

//属性

var width:Int

var height:Int

//方法

func area()->Int{

return self.width*self.height;

}

//允许修改属性的方法前缀 mutating

mutating func zoomIn() {

self.width += 100

self.height += 100

}

}

协议

//可以被class,struct,enum实现

protocol Sharp{

//属性

var width:String{get}

var heiht:String{get set}

//方法

func area()->Int

}

//swift 可选和必选协议

//只能被class实现,无法给struct和enum实现

@objc protocol OptionalProtocol {

//可选协议

optional func optionalMethod()

//必选协议

func necessaryMethod()

}

对象

class Card: NSObject {

}

class Person: NSObject {

//私有对象

private var _name:String?

var gender:String

var gender1:String?

//arc

/*

weak 用于可空对象,unowned用于非空对象

weak 调用被释放的对象会返回nil,unowned 调用被释放的对象会出异常

建议 如果能够确定在访问时不会已被释放的话,尽量使用 unowned,如果存在被释放的可能,那就选择用 weak

*/

weak var bastFriend:Person?

unowned var identityCard:Card

//构造函数

init(name: String) {

gender = "male"

identityCard = Card()

super.init()

//初始化。。。

self.name = name

}

//便利构造函数

convenience init(name:String,gender:String)

{

self.init(name:name)

self.gender = gender

}

//析构函数

deinit{

}

//属性

var name:String{

get{

return _name!

}

set{

_name = newValue;

}

//可以自定newValue的名称

//set(newName){

//  _gender = newName

//}

}

//观察者模式的属性

//newValue 和 oldValue

var age:Int = 0{

willSet{}

didSet{}

}

//方法

func sayName(){

print("hello name")

}

//静态方法

static func say(){

print("hello")

}

//类方法

class func say1(){

print("hello1")

}

//方法重载

override func copy() -> AnyObject {

return ""

}

//懒属性

//两种方式,方法加载和闭包加载

lazy var friends:[String] = self.findfriends()

func findfriends()->[String]{

return ["bob","bill","jobs"]

}

lazy var bastFirends:String = {

print(" print bastFirends")

return "liuyanwei"

}()

//调用

//NSLog("bastFirends:%@ and friends is:[%@] ",p.bastFirends,p.friends)

//下标脚本

subscript(name:String)->String{

get{

return self.name

}

set{

self.name = newValue;

}

}

}

(二)语法

流程控制

if语句

//判断是Option类是否有值

if let theStr = str2 {

print("ture")

}

swich

//switch 数字区间

var condition1 = 888_888_888;

switch condition1{

case -999_999...38: print("case1");

case 40...88: print("case2");

case 100...188: print("case3");

case 200...999_999_999_999: print("case3");

default:break;

}

//switch  元组

var condition2 = (100,88);

switch condition2{

case (-99999...0,-99999...0),(40...88,0..<100): print("case1")//匹配多个条件

case let (_,y): print(y); fallthrough // 值绑定,fallthrough 坠落下一个条件

case (_,0...100): print("case3");// “_” 匹配所有

default:break;

}

//switch 值绑定和where语句

var condition3 = 100

switch condition3{

case let i where i<50 :print("case1")

case let i where i<120 && i>50 :print("case2")

default :break;

}

//switch 枚举

enum BarCode{

case UPCA(Int,Int,Int)

case QRCode(String)

}

var condition4 = BarCode.UPCA(10, 5, 2)

switch condition4{

case let .UPCA(a,b,c): print("a:\(a)|b:\(b)|c:\(c)")

case .QRCode: print("case:2")

//    default: break

}

//对option的判断

let num: Int? = nil

switch num {

case nil: println("没值")

default:  println("\(num!)")

}

函数

//无参数

func hello(){}

//有参数

func hello(name:String){}

//有参数和返回值

func hello(name:String)->String{}

//多个参数

func hello(name:String,age:Int){}

//多个返回值

func hello()->(String,Int){    

return (num1,num2,num3)

}

//可变参数

func hello(name:String...){}

//函数的嵌套

func hello1(){    func hello2(){}}

//参数的默认值

func hello1(msg:String = "defaultMsg"){}

//返回值是函数

func hello()->(String->String){

    func hello1(name:String)->String{}   

 return hello1

}

//参数是函数

fun hello(msg:String,callback(Void->Void)){ 

   callback()

}

//函数参数是变量

//若不声明var ,默认参数类型是let,就无法修改参数的值

func hello(var msg:String){ 

   msg += "hello"    print(msg)

}

//函数参数的命名

func hello(name name:String ,withAge age:Int){}

func hello1(name:String ,age:Int){}

//调用

hello(name:, withAge:)//默认的参数命名

hello1(, age:)//指定的参数命名

//匿名函数

//{}可以作为匿名函数

//例如调用上面的hello方法(参数是函数)

hello("hi",   

 {    

 //dosthing   

 })

//有参数的匿名函数

{   

 (msg:String)->String in   

 return msg

}

//泛型参数//输入输出参数的函数

func myswap(inout obj1:T,inout _ obj2:T){

let temp:T = obj1

obj1 = obj2

obj2 = temp

}

闭包

var array = ["f","a","c","d","e"]

//完整写法

//{ (参数:类型) in 执行方法 return 返回值}

array.sort({

(s1:String,s2:String) -> Bool in

return s2 > s1;

})

//省略参数类型和括号

//{ 参数$1,$2 in 执行方法 return 返回值}

array.sort({

s1,s2 -> Bool in

return s1 > s2;

})

//省略参数类型和return关键字

//{ 参数$1,$2 in 返回值}

array.sort({

s1,s2 ->Bool in

s1 < s2

})

//省略参数名

array.sort({

$1 < $0

})

//尾随闭包

array.sort(){

$1 < $0

}

//上面的几个其实只是匿名函数,不是真正的闭包。swift里面称他们是闭包,那就算是吧。真正的闭包是下面这个

//闭包(closure)就是封闭的意思

//闭包的概念,闭包概念有很多,我觉得比较好理解的的是松本行弘给的定义:将局部变量这一环境封闭起来的结构,叫做闭包

func count()->(()->Int){

var i = 0;

return {

()->Int in

return ++i

}

}

//测试使用

var touch = count()

touch()//1

touch()//2

touch()//3

touch()//4

异常处理

enum AwfulError: ErrorType {

case Bad

case Worse

case Terrible

}

func hello () throws{

throw AwfulError.Bad

}

do {

try hello()

print("final")

}

catch AwfulError.Bad {

print("Bad")

}

catch AwfulError.Worse {

print("Worse")

}

catch AwfulError.Terrible {

print("Terrible")

}

catch  {

print("all error")

}

Selector

objc里面有@Selector(),在swift可以使用 let someMethod = Selector(“someMethodName”)得到。大多数情况无需这样

func callMe() {

NSLog("this is callMe")

}

func callMeWithParam(timer:NSTimer) {

NSLog("this is callMeWithParam,prarm is :\(timer.userInfo as! String)")

}

//无参数

NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector:"callMe", userInfo: nil, repeats: true)

//带参数,不使用Selector

NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector: "callMeWithParam:", userInfo: "i'm prarm", repeats: true)

扩展

extension Person{

    func anotherHello(){

       NSLog("another hello")

  }

}

高级

柯里化 (Currying)  

(引用大神的文章,这是第一次听说过这个词语,转账过来,慢慢了解)

func addTwoNumbers(a: Int)(num: Int) -> Int {

return a + num

}

let addToFour = addTwoNumbers(4)    // addToFour 是一个 Int -> Int

let result = addToFour(num: 6)      // result = 10

封装局部变量

封装局部变量可以减少变量之间的冲突

var str:String = {

  //局部变量被封装

  let str1 = "hello",str2 = "world"

    return "\(str1) \(str2) !"

 }()

方法调用的另一种方式

class Person {

//普通方法

func hi(name:String) -> String{

return "hi \(name)"

}

//静态方法

class func hello(){

NSLog("hello")

}

}

let person = Person()

//常规方法调用

person.hi("liuyanwei")

Person.hello()

//利用方法名调用

let funcOnPerson1 = Person.hi

funcOnPerson1(person)("liuyanwei")

//调用静态方法

let funcOnPerson2 = Person.hello

funcOnPerson2()

swift单例标准写法

class MyManager  {

static private let sharedInstance = MyManager()

    class var sharedManager : MyManager {

          return sharedInstance

   }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容