app入门 swift
2015-04-18 20:12:32 Dreamer_undo 阅读数 371

swift入门,找了个简单app教程

教程地址:http://testerhome.com/topics/1450


IDE:Xcode6.2 


其中遇到了以下几个个问题:

问题一:'URLWithString' is unavailable: use object construction 'NSURL(string:)‘

根据提示直接是用NSURL(string:)来创建url,传值给NSURLRequest的参数加 !拆包


问题二:show the object library 显示 No matches

准备添加往view 加入空间是出现的,在stackoverflow.com找到的答案http://stackoverflow.com/questions/26354956/no-items-in-object-library-xcode-6

第一次创建swift工程,点击Main.storyborder的时候,可能我好几次都是双击打开的,都是弹出浮动窗口。

单击storyborder在主面板中展示就没这问题了。


问题三:simulator窗口过大

使用command+1,command+2,command+3,进行100%,75%,50%大小的切换

2015-09-14 22:49:40 qq_23567703 阅读数 88

import Foundation


println("Hello, World!")


//1.

let b = 10

var a = 5

a = b

println(a)


if a == b {

    

}


var x1 = 1 + 2

var x2 = 10.0 / 2.5

//本来是character  但是两个不能相加

let dog: String = "

2015-12-10 01:36:55 SayDy_ 阅读数 125

//: Playground - noun: a place where people can play


import UIKit


let label = UILabel(frame: CGRect(x: 0, y: 0, width: 600, height: 15))

label.backgroundColor = UIColor.cyanColor()

label.font = UIFont.systemFontOfSize(10)

label.text = "常量,变量,可选,解包"



// 创建一个常量,常量只能进行一次赋值,运算符两侧必须有空格

let str = "Hello, World"

// 创建一个变量

var strM = "Hello, playground"


// 根据后面的内容自动推倒类型,option + leftClick 可以查看属性的类型

let strI = 1        //int

let strD = 1.2      //double ,float


// 指定类型 ,类型首字母大写

let strInt: Int = 1;

let strDouble: Double = 1.2;


// 强制类型转换,类型首字母大写

Double(strInt)


// Swift不支持隐式转换

// strInt + strDouble

Double(strInt) + strDouble



// Optional 可选值,可为nil

let int: Int? = 10;

// 可选类型打印时,如不解包,将输出Optional(10)

print(int)

// 解包,正常输出

print(int!)

// 计算必须解包

print(int! + 10)

// 强制解包不能为nil

var a:Int? = nil

// print(a!) 导致崩溃

// NSURL(string:string)的返回值为 NSURL? ,如果链接中有中文返回为nil

let url = NSURL(string: "http://www.baidu.com/不能有中文")

// 强制解包将崩溃

// print(url!)


// ?? 运算符

let int3: Int? = nil;

// 如果??前面的值等于空,将使用??后面的值代替

print((int3 ?? 12) + 12) //注意?? 的优先级较低


label.text = "分支: if,guard,三目,Switch"


// if

let num = 200

// 必须明确判断结果位true/false,花括号不能省略

if num < 100 {

    print("num小余100")

}else {

    print("num大于100")

}


// 三目运算符

let numA = 10

let numB = 20

let numMax = numA > numB ? numA : numB


// 可选项条件判断

let url6 = NSURL(string: "http://www.baidu.com");

var url6Request = NSURLRequest(URL: url6!)         // 强制解包

if url6 != nil {

    url6Request = NSURLRequest(URL: url6!)          // 检测后强制解包

}

if let urlIf = url6 {                               // if let方式判断后解包

    if urlIf.host == "www.baidu.com" {              // 再次判断

        url6Request = NSURLRequest(URL: urlIf)

    }

}

if let leturlIf =  url6 where leturlIf.host == "www.baidu.com"{ // 一次性判断条件 附加条件

    url6Request = NSURLRequest(URL: leturlIf)

}


// 多个可选项判断,同时都不为nil,执行if

let dName: String? = "小蓝"

let dAge: Int? = 100

if let name = dName , let age = dAge {

    print("姓名:\(name) 年龄:\(age)")

}


// guard是否为空判断

func guardT (){

    let score: Double? = nil

    guard let _ = score else{ //属性不需要时可使用_代替

        print("score为空")

        return

    }

}

guardT()


// Switch分支选择

let switchLet = ""

switch switchLet {

case "":

    print("80 ~ 100")

case "":

    print("70 ~ 80")

case "":

    print("60 ~ 70")

case "":

    print("60分以下")

default:break

}


// switchwhere判断

let point = CGPointMake(10, 10)

switch point {

case let p where p.x == 0 && p.y == 0:

    print("中心点")

case let p where p.x == 0:

    print("Y")

case let p where p.y == 0:

    print("X")

case let p where abs(p.x) == abs(p.y):

    print("对角线")

default:

    print("其他")

}


label.text = "循环: for"

// 循环

// 传统 0,1,2,3,4,5,6,7,8,9

for var i = 0; i < 10; i++ {

    print(i)

}


// 按数字 0,1,2,3,4,5,6,7,8,9

for i in 0..<10 {

    print(i)

}

// 按数字 0,1,2,3,4,5,6,7,8,9,10

for i in 0...10 {

    print(i)

}


// 不使用下标时,可以使用_代替

for _ in 0..<10 {

    print("Hello,World")

}


label.text = "字符串"

// 字符串操作

let str1: String = "小蓝是小绿,啦啦啦啦啦"

print("字符个数:\(str1.characters.count)")

print("字节个数:\(str1.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))")

print("utf8个数\(str1.utf8.count)")

// 遍历字符串内容

for obj in str1.characters {

    print(obj)

}


// 字符串拼接

let str10 = "Hello"

let str20 = "World"

let number = 10

let number2:Int? = nil

// 加号拼接

let strRult = "\(number)," + str10 + " ,"+str20

// 可选项的拼接

let strRult2 = "\(number2  ?? 0) ," + str10 + "," + str20


let h = 10

let m = 59

let s = 59

// format拼接字符串

let strRult3 = String(format: "%02d : %02d : %02d", arguments: [h,m,s])

let strUrlt4 = String(format: "%02d : %02d : %02d", h, m, s)


let str3 = "你追我~如果你追上我~"

// 转换OC截取字符串

(str3 as NSString).substringWithRange(NSRange.init(location: 0, length: 3));

// 使用文字个数读取

str3.substringToIndex("abc".endIndex)

// 使用range截取

let startRange = "1234".endIndex

let endRange = "1234567891".endIndex

str3.substringWithRange(startRange ..< endRange)



label.text = "集合: 数组,字典"


// 数组的定义 

// let nums: [Int]

let nums = [1, 2, 3, 4, 5, 6]

// let strs: [String]

let strs = ["a", "b" ,"c"]

// let arr: [NSObject]

let arr = [1 ,"a"]


// 遍历

for number in nums {

    print(number)

}

// 下标取值

let num1 = nums[0]


// 可变数组var arrM: [String]

var arrM: [NSObject] = [NSObject]()

// 循环33

for i in 1...33 {

    // 追加数组数据

    arrM.append("\(i)")

    // 数组空间容量 达到上限时*2

    print("数组容量:\(arrM.capacity)")

}

// 移除第一个

arrM.removeFirst()

// 移除最后一个

arrM.removeLast()

// 移除指定成员

arrM.removeAtIndex(0)

// 移除指定区域

arrM.removeRange(Range<Int>.init(start: 5, end: 10))

// 移除所有

arrM.removeAll()


// 数组的合并 ,需要同类型数组

arrM += arr



//字典

// 不可变字典

let dic = ["key" : "value" ,"age" : 8]

// 可变字典

var dicM = [String:String]()

// 添加,直接赋值,如果没有将添加

dicM["NewKey"] = "NewValue"

dicM["NewKey2"] = "NewValue2"


// 如果存在则覆盖值

dicM["NewKey"] = "Select"


// 遍历

for (k ,v) in dicM {

    print("key:\(k) value:\(v)")

}


// 合并字典

let dictTemp = ["temp" : "tempValue" ,"temp2" : "tempValue2"];

// 遍历被合并字典

for (k ,v) in dictTemp {

    // 添加到可变合并字典

    dicM["\(k)"] = v

}

print(dicM)


label.text = "函数: 闭包"

//函数的定义

// 无参无返回值

func af () -> Void {

}

// ()代替void

func bf () -> () {

}

// 省略返回值

func cf (){

}


// 有参有返回值  

// func 函数名(外部参数名 形式参数名: 形式参数类型) -> 返回值类型 { // 代码实现 }

// Swift 2.0 中,默认第一个参数名省略,可添加标识名

func ay (ayNum1 ayNum1: Int, ayNum2 :Int) -> Int {

    return ayNum1 + ayNum2

}

ay(ayNum1: 10, ayNum2: 5)


// 最简单的闭包

let bl = {

    print("简单闭包")

}

bl()

// 有参有返回值闭包

let Sum = {

    (num1 sumNum1 :Int ,num2 sumNub2 :Int) -> (Int) in

    return sumNum1 + sumNub2

}

Sum(num1: 10, num2: 2)



func netWork (finish :(String) -> ()) {

    dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in

        print("加载数据")

        dispatch_async(dispatch_get_main_queue(), { () -> Void in

            print("返回主线程刷新UI")

            finish("html")

        })

    }

}

// 调用闭包,playGround无法测试结果

netWork { (html) -> () in

    print(html)

}


// -----------




2016-04-03 20:11:18 xyj1204 阅读数 291

一、Swift与OC的区别

1、创建是选择Swift语言

2、Swift中不区分.h.m,统一到.swift中,既Swift中swift文件声明和实现不在分开创建

3、导入类名、框架:

     不需要导入类名,所有的类名都是公开的可以直接访问到 。

     直接导入框架的名字,例如:import UIKit

4、OC程序入口是main函数 

  Swift的程序入口:代码是从上往下执行,@UIApplicationMain是程序的主入口

5、class 用来声明类

   class后面是类名:冒号后面是父类,父类后面导入代理协议:在父类后面继续添加,写上代理协议的名字

例如:var window: UIWindow?Swift声明一个变量(属性)

6、func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool :func用来表示方法的

7、

变量常量的声明

var:声明一个变量

let:声明一个常量

声明公式

OC:数据类型 名字 =

Swiftvar 名字:数据类型 =

       let 名字:数据类型 =

Switf:语句结束之后,可以不写分号,但是如果一行有多条语句,就必须添加分号

Switf:也支持中文作为变量名(支持中文的编码格式)

字符串可以通过+拼接


如果声明的对象是变量,但是并没有去改变这个变量的值,系统会提示,可以声明成常量


Xcode7.3Swift2.2)之后 ++Swift3中弃用,改成+=


Swift:自动推断数据类型,如果没有告诉变量的数据类型,会自动推断他的类型


Switf:不同的数据类型,不允许计算


数据类型转换, 数据类型(要转换的变量)


如果声明变量的时候,不想在声明的时候去赋值,必须添加上变量的数据类型(因为没有推断的依据,推断不出数据类型)



Switf 中禁止 不同数据类型进行计算

拼接字符串->直接使用+拼接


Swift代码,格式要特别工整



方法的定义和调用

fanc定义方法


OC写法

- (void)viewDidLoad{

}

swift写法

func viewDidLoad(){

}


oc:

- (void)viewDidAppear:(BOOL)animated{

}


swift

func viewDidAppear(animated: Bool) {


}


OC

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


return YES;

}


swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

return true

}


区间:

闭合区间 区间

半闭合区间


1 2 3 4 5

全闭合区间1...5


1 2 3 4 5

半闭合区间1..5


Swift中提倡使用区间



代码:


import UIKit


@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

//声明一个变量

        let 名字:NSString = "明天,你好"

// 输出。拼接字符串

        print((名字 as String) + "蒲公英的约定")

        

//        var age:Int = 18

//        age = 18+10

//        age+=1

//        print(age)

        

        

        let height = 180

        

        print(height)

        

        let name = "九九"

        print(name)

//        相同数据类型可以相加

//        var age = 18.4

//        age = age+0.6

//        print(age)

        

        let age = 18

        let yaerAge :Float = Float(age) + 0.5

        print(yaerAge)

//        Int(yaerAge)float类型转换成int类型

        

  //MARK:方法的调用

        方法名字()

       

        loadData()

        

        无返回值大餐("你好")

        

       print(有参有返回值("055346", 参数2: " 8oijkm"))

        print(sum(10, b: 10))

        

//        调用UIVie里面的init

//        Switf中调用其他类里面的方法,用.来调用

        

//        快捷创建一个对象:MyView() init

//        创建带有frame:MyView(frame: CGRectMake(0, 0, 300, 400))

        /*

        let view :MyView = MyView(frame: CGRectMake(0, 0, 300, 400))

        view.backgroundColor = UIColor.redColor()

        

        window!.addSubview(view)

*/

        

        window = UIWindow.init(frame:UIScreen.mainScreen().bounds)

        window?.backgroundColor = UIColor.yellowColor()

        

        let rootVC:UITabBarController = UITabBarController.init()

        

        let titles = ["","",""]

        

        

        //        数组初始化没有@

        rootVC.viewControllers = [UINavigationController.init(rootViewController: LearnViewController()),UINavigationController.init(rootViewController: DrawViewController()),UINavigationController.init(rootViewController: UserViewController())]

        

        

//        for (var i=0; i<rootVC.viewControllers?.count;i+= 1){

//            

//        }

       /*

        for (var i =0; i<rootVC.viewControllers?.count;i++){

        

            let vc:UIViewController = rootVC.viewControllers![i]

            vc.title = titles[i]

        }

*/

       /* int i = 0;

        for UIViewController *vc in rootVC.viewControllers {

            vc.titlt = titles[i];

            i++;

        }

*/

        var i = 0

        for vc in rootVC.viewControllers! {

            vc.title = titles[i]

            i += 1

        }

        

//        区间

//        for i in 0 .. rootVC.viewControllers!.count{

//        

//        

// 

//            

//        }

        

        window?.rootViewController = rootVC


        window?.makeKeyAndVisible()

        return true

    }


//MARK:-------创建一个无返回无参的函数----


    func 方法名字 () {

    

    print("无返回无参的函数")

        

    }

   

    func loadData () {

    print("正在加载数据......")

    

    }

//    MARK:-----无返回值带参-----

    func 无返回值大餐 (参数名:NSString) {

    

        print(参数名)

        

    }

//    MARK:-----有参有返回值---

    func 有参有返回值 (参数名:NSString,参数2:NSString) -> NSString{

    return "返回值类型相同的数据"

    }

    

    

    func sum (a:Int,b:Int) -> Int{

    return a + b

    }

    

    func 创建更控制器(){

//创建UITabBarController

        let rootVC:UITabBarController = UITabBarController.init()

        

        let titles = ["","",""]

//        数组初始化没有@

        rootVC.viewControllers = [UINavigationController.init()]

        window?.rootViewController = rootVC

        

    }




2015-08-27 17:50:49 jiahao8915 阅读数 760

Swift 入门

简介

  • Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序
  • 2014 年,在 Apple WWDC 发布

历史

  • 2010 年 7 月,苹果开发者工具部门总监 克里斯·拉特纳 开始着手 Swift 编程语言的设计工作

  • 用一年时间,完成基本架构

  • Swift 大约历经 4 年的开发期,2014 年 6 月发表

特色

  • 苹果宣称 Swift 的特点是:快速、现代、安全、互动,而且明显优于 Objective-C 语言
  • 可以使用现有的 CocoaCocoa Touch 框架
  • Swift 取消了 Objective C 的指针及其他不安全访问的使用
  • 舍弃 Objective C 早期应用 Smalltalk 的语法,全面改为句点表示法
  • 提供了类似 Java 的名字空间(namespace)、泛型(generic)、运算对象重载(operator overloading)
  • Swift 被简单的形容为 “没有 C 的 Objective-C”(Objective-C without the C)

现状

  • 2015 年 2 月,苹果同时推出 Xcode 6.2 Beta 5 和 6.3 Beta,在完善 Swift 1.1的同时,推出了 Swift 1.2 测试版
  • 2015 年 6 月,苹果在 WWDC 发布了 Swift 2.0 测试版,并且宣称在年底开源
  • 从发布至今,苹果的每一个举措都彰显其大力推广 Swift 的决心
  • Swift 当前正式版本:1.2,测试版本是 2.0
  • 目前有些公司的新项目已经直接采用 Swift 开发
  • 目前很多公司已经在做 Swift 的人才储备
  • 应聘时,会 Swift 开发 无疑会增加自身筹码
  • 刀哥预测:到 2015 年底,iOS 9.0 正式发布的同时,Swift 势必大行其道!

资源网站

常量&变量

简单体验

// 定义变量
var i = 10
print(i)
i = 15
print(i)

let j = 20
// 常量一经定义不能自改数值
//        j = 25
print(j)
  • 阶段性小结
    • var 定义变量,设置之后可以修改
    • let 定义常量,设置之后不可以修改
    • 语句末尾不用使用 ;
    • 在 Swift 中使用 print() 替代 OC 中的 NSLog
    • print 的性能更好,后面会演示

定义 OC 对象

// 实例化视图
let v = UIView(frame: CGRectMake(0, 0, 100, 100))
// 设置背景颜色
v.backgroundColor = UIColor.redColor()

// 添加到根视图
view.addSubview(v)
  • 阶段性小结
    • Swift 中要实例化一个对象可以使用 类名() 的格式,与 OC 中的 alloc/init 等价
    • OC 中的 initWithXXXSwift 中通常可以使用 类名(XXX: ) 找到对应的函数
    • OC 中的 [UIColor redColor] 类方法,在 Swift 中通常可以使用 类名.XXX 找到对应的函数
    • 使用 let 修饰 v 并且赋值,表示 该常量的内存地址不允许修改,但是可以修改其内部的属性
    • 当前对象的属性,不需要使用 self.

常量&变量的使用原则:尽量先用 let,只有需要变的时候,再用 var,能够更加安全

变量类型

let x = 10
let y = 10.5
let z: Double = 20

print(Double(x) + y)
print(x + Int(y))
print(y + z)
  • 阶段性小结
    • 初次接触 Swift 中会因为简单的 var let 误以为 Swift 中的类型非常松散
    • 其实所有变量的准确类型都是在赋值的同时自动推导的
    • Swift 是对类型要求非常严格的一门语言,一个值永远不会被自动转换成其他类型
    • 如果要转换,必须显示转换,Swift 中
      • 小数默认是 Double 类型
      • 整数默认是 Int 类型
    • 如果要显式的指定变量的类型,可以在定义是使用 var 变量名: 类型 = 值

逻辑分支

简单体验

var i = 10

if i > 0 {
    print("OK")
}
  • 阶段性小结
    • Swift 中没有 C 语言中的非零即真概念
    • 在逻辑判断时必须显示地指明具体的判断条件
    • if 语句条件的 () 可以省略
    • 但是 {} 不能省略

三目

var a = 10
var b = 50

var result = a > b ? a : b
print(result)
  • 阶段性小结
    • Swift 中的 三目 运算保持了和 OC 一致的风格

可选项

演练 1

let url = NSURL(string: "http://www.baidu.com/?word=iphone")

if url != nil {
    NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, _) -> Void in
        print(NSString(data: data, encoding: NSUTF8StringEncoding))
    }).resume()
}
  • 阶段性小结
    • Swift 中,不是所有的对象实例化方法都会返回值,在实际开发中需要注意实例化函数的返回类型,例如:
 convenience init?(string URLString: String)
* 如果有 `?` 表示改方法有可能无法实例化到正确的对象
* 这种函数返回的对象,被称为 `可选项`,即有可能有值,也有可能没有值
* 实际开发时,需要针对这种对象加以判断,并且在分支内部使用 `!`,指明改对象确实是存在的
* 相比在 `OC` 的开发,尤其在日常练习时,会给定一个能够运行的值,而在实际运行时,一旦条件不满足,会直接闪退,这样用户体验会非常不好

Swift 的设计者考虑到因为对类型的强制要求,会让代码很难看,因此提供了一个变通的解决方案

演练 2

if let let url = NSURL(string: "http://www.baidu.com/?word=iphone") {
    NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, _, _) -> Void in
        print(NSString(data: data, encoding: NSUTF8StringEncoding))
    }).resume()
}
  • 阶段性小结

    • 使用 if let 常量 = 可选构造函数 的方式能够确保分支内部常量一定是有值的
    • 并且在分支内部不再需要使用 !
    • 这是 Swift 代码中的一个非常重要的使用技巧
  • 提示

    • 尽管 Swift 提供了类型校验的手段,但是要写出 优雅 的 Swift 代码,还是需要多加练习的,否则一不小心就会出现分支嵌套层次很深的代码
    • 有关 ?! 的选择,可以借助 Xcode 的辅助工具,但是强烈建议每次遇到提示时,要多加思考,反复揣摩

演练3

var name: String?
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))

name = "zhangsan"
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))

let l = 10
print(l + (name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) ?? 0))
  • 阶段性小结
    • ?? 是一个非常有用的操作符,能够快速对 nil 进行判断
    • 如果对象是 nil,则使用 ?? 后面的值代替前面的 nil 值参与计算
    • 在使用 ?? 时,整个部分需要使用 () 包装
    • 这一技巧在 UITableView 的数据源方法中尤为重要

循环

OC风格的 for

// 传统写法
for var i = 0; i < 10; i++ {
    print(i)
}

Swift风格的 for

// 遍历 0 ~ <10
for i in 0..<10 {
    print(i)
}

print("---")

// 遍历 0 ~ 10
for i in 0...10 {
    print(i)
}
  • 阶段性小结
    • Swift 中使用 in 关键字标示循环的范围
    • 0..<10 表示从0到9
    • 0...10 表示从0到10
    • 注意之间不能出现空格

特殊写法

for _ in 0...10 {
    print("hello")
}
  • 阶段性小结
    • 如果不关心循环本身的索引,可以使用 _ 忽略
    • 这一技巧在之前的分支演练中出现过

字符串

在 Swift 中绝大多数的情况下,推荐使用 String 类型

使用 String 的原因

  • String 是一个结构体,性能更高
    • String 目前具有了绝大多数 NSString 的功能
    • String 支持直接遍历
  • NSString 是一个 OC 对象,性能略差
  • Swift 提供了 StringNSString 之间的无缝转换

遍历字符串

let str = "我要飞的更High"

for s in str {
    print(s)
}

字符串拼接

let str1 = "zhangsan"
let str2 = "lisi"
let i = 10

print(str1 + str2)
print("\(str1) \(str2) \(i)")
  • 阶段性小结
    • 直接在 "" 中使用 \(变量名) 的方式可以快速拼接字符串
    • 我和我的小伙伴再也不要考虑 stringWithFormat 了 :D

格式化字符串

for _ in 0...10 {
    let str = String(format: "zhangsan - %04d", arguments: [arc4random_uniform(100)])
    print(str)
}
  • 阶段性小结
    • 在实际开发中,如果需要指定字符串格式,可以使用 String(format:...) 的方式
    • 注意:后面的参数需要放在一个数组中

String & Range 的结合

以下是超级费劲的代码

let str: String = "我要飞的更High"

var subStr = str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex))
print(subStr)

subStr = str.substringWithRange(Range<String.Index>(start: advance(str.startIndex, 0), end: advance(str.startIndex, 3)))
print(subStr)

建议写法

let str1: NSString = "我要飞的更High"
print(str1.substringWithRange(NSMakeRange(0, 3)))

数组

简单体验

let arr = ["zhangsan", "lisi"]
print(arr)

// 遍历每一个元素
for a in arr {
    print(a)
}

// 像 OC 一样打印
print(arr as NSArray)

数组中保存的对象类型

// 数组中保存的都是字符串
let arr = ["zhangsan", "lisi"]

// 数组中保存的是 NSObject
let arr1 = ["zhangsan", 1]
  • 阶段性小结
    • 数组使用 [] 定义,这一点与 OC 相同
    • 如果初始化时,所有内容类型一致,择数组中保存的是该类型的内容
    • 如果初始化时,所有内容类型不一致,择数组中保存的是 NSObject

常见数组操作

// 定义只能保存字符串类型数组
var array: [String]

// 初始化数组
array = ["zhangsan"]

// 添加元素
array.append("lisi")

print(array)

// 删除元素
array.removeAtIndex(1)
print(array)

// 删除所有元素
array.removeAll(keepCapacity: true)
print(array.capacity)

// 注意数组容量的变化
for i in 0..<10 {
    array.append("\(i)")
    print("\(array) --- \(array.capacity)")
}

// 实例化新的数组
var array2 = [String]()
array2.append("1")
array2.append("2")

// 拼接数组
array += array2

print(array)
  • 阶段性小结
    • 如果定义数组时指定了保存对象的类型,择不能向数组中添加其他类型的内容
    • 可以使用 [String]()
    • let 定义的数组是不可变的
    • var 定义的数组是可变的

字典

/// 定义并实例化字典
var dict = [String: AnyObject]()

dict["name"] = "zhangsan"
dict["age"] = 18

print(dict)

// 设置相同 key,之前的数值会被覆盖
dict["name"] = "lisi"
print(dict)

// 删除某一个 key
dict.removeValueForKey("age")
print(dict)

dict["title"] = "manager"
print(dict)

// 遍历字典(k, v可以随便写)
for (k, v) in dict {
    print("\(k) -- \(v)")
}

// 合并字典
var dict2 = ["name": "wangwu", "age": 80, "title": "boss"]
for (k, v) in dict2 {
    dict.updateValue(v, forKey: k)
}
print(dict)

函数

简单演练

func sum(a: Int, b: Int) -> Int {
    return a + b
}
  • 阶段性小结
    • 函数定义格式:func 函数名(参数: 参数类型...) -> 返回值 { // 代码实现 }
    • 如果没有返回值, -> 返回值 可以省略
    • -> 是一个很有意思的符号
    • 默认情况下,在调用函数时,第一个参数名是省略的

参数名的特殊处理

强制要求参数名

func sum1(x a: Int, y b: Int) -> Int {
    return a + b
}

省略参数名

func sum2(a: Int, _ b: Int) -> Int {
    return a + b
}

闭包

  • 闭包定义
  • 闭包简化 - 尾随闭包
  • 闭包参数
  • 闭包返回值
  • 闭包的循环引用
weak var weakSelf = self
demo("zhangsan") { (_) -> Int in
    print(weakSelf?.view.backgroundColor)

    return 20
}

懒加载

lazy var demoView: UIView = {

    let v = UIView(frame: CGRectMake(10, 10, 100, 100))
    v.backgroundColor = UIColor.redColor()

    return v
}()
  • 格式:
lazy var 变量: 类型 = { 创建变量代码 }()
  • 懒加载的写法本质上是定义并执行一个闭包

getter & setter

自定义 Person 类

class Person: NSObject {

    var name: String?
    var age: Int?
}

getter & setter

var _name: String?

var name: String? {
    get {
        return _name
    }
    set {
        _name = newValue
    }
}
  • Swift 中以上形式的 getter & setter 很少用

didSet

  • 在 OC 中,我们通常希望在给某一个变量赋值之后,去做一些额外的操作
  • 最经典的应用就是在自定义 Cell 的时候,通过模型的设置方法完成 Cell 的填充
var length: Int? {
    didSet {
        timeStr = String(format: "%02d:%02d:%02d", arguments: [length! / 3600, (length! % 3600) / 60, length! % 60])
    }
}
var timeStr: String?

计算型属性

var title: String {
    get {
        return "Mr " + (name ?? "")
    }
}
  • 只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性
  • 计算型属性本身不占用内存空间
  • 不可以给计算型属性设置数值
  • 计算型属性可以使用以下代码简写
var title: String {
    return "Mr " + (name ?? "")
}

构造函数

init(dict: [NSObject: AnyObject]) {
    name = dict["name"] as? String
    age = dict["age"] as? Int
}

析构函数

deinit {
    print("88")
}

ATS 应用传输安全

App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.

If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.

强制访问

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

设置白名单

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

Swift入门

阅读数 9

[size=medium]从TheSwiftProgrammingLanguage中总结出来的,拷贝到Xcode6中即可运行。[/size][code="java"]importFoundationprintln("Hello,World!")//赋值letmyVar:Float=4println(myVar)//值的转换没有隐式转换le...

博文 来自: bbq191

Swift入门

阅读数 82

Swift入门教程Swift控件教程Swift高级篇Swift服务端

博文 来自: weixin_34248849

Swift入门

阅读数 151

简单值使用let来声明常量,使用var来声明变量。一个常量的值在编译时并不需要获取,但是你只能为它赋值一次。也就是说你可以用常量来表示这样一个值:你只需要决定一次,但是需要使用很多次。varmyVariable=42myVariable=50letmyConstant=42常量或者变量的类型必须和你赋给它们的值一样。然而,声明时类型是可选的,声明的

博文 来自: u011781769

Swift 入门

阅读数 18

前言Whothisbookisfor有一点程序或完全无程序设计基础可以与iOSApprentice这系列同步学习各部分简介计算机如何工作/swfit的运行环境特征/swift语言基础swift中集合类型数据的存储在swift中构建自己的数据类型swift中的进阶话题一.swift基础1.编程...

博文 来自: weixin_34346099

SWIFT入门

阅读数 8

接上次数组后面1集合集合也是一种容器,集合内数字没有顺序,是直接通过哈希码来查找//集合通过哈希码找值//哈希码(hashcode)/散列码//例子MD5(数据库存储密码)/SHA-1(是摘要而不是加密)//1.1创建一个集合vara:Set&lt;Int&gt;=[5,5,66,4,54,86,45,4,56,4]prin...

博文 来自: weixin_33898233
没有更多推荐了,返回首页