美文网首页Swift_Learn@IT·程序猿Swift编程
三日上手swift(第二日)会陆续更新到项目

三日上手swift(第二日)会陆续更新到项目

作者: 子祖 | 来源:发表于2016-08-16 23:48 被阅读519次

本swift教程并不是教大家如何如何玩转一门语言,是让大家快速看懂别人swfit的项目,最后加上强大的复制粘贴和万能的google,用一种相对极端的方法快速入门做项目



重复说明,我的写代码,大家千万不要拿去敲(谁敲谁傻b),太浪费时间和消磨积极性,只需要根据代码板块复制粘贴到playground上看(不知道的看上一篇文章), 一块一块看比较有效率 ,特别要看打印结果,然后可以自己根据思路写上注释,如果遇到报错,可能是你复制粘贴代码导致重复定义,也可能是xcode的问题,细节不用太在意,主要了解语法结构!

重点到最后一章我会上传一个小项目让你大家来敲一遍,敲到不懂的回来看即可!


可选类型的应用场景

// 2.可选类型的应用场景
// 2.1.将字符串类型转成Int类型
let str = "123"
let result = Int(str)

// 2.2.根据String创建一个NSURL

let urlString = "http://www.baidu.com"

let url : NSURL? = NSURL(string: urlString)
if let url = url {
    let request = NSURLRequest(URL: url)
}

// 2.3.根据一个文件名称, 获取文件的路径
let path = NSBundle.mainBundle().pathForResource("123.plist", ofType: nil)

if let path = path {
    NSArray(contentsOfFile: path)
}
is 的使用
// 1.is 的使用
let infoArray = ["Kobe", 18, 1.98]
let item = infoArray[0]

// item.isKindOfClass(UIView.self) 判断是否是某种类

if item is String {
    print("是一个字符串")
} else {
    print("不是一个字符串")

}
as 的使用
// 2.as 的使用

// 2.1. as 的直接使用  -> Swift类型和OC类型之间的转化

let infoArray = [Kobe", 18, 1.98]

let urlString = "www.baidu.com"
(urlString as NSString).substringToIndex(3)

// 2.2 as? 的使用 : 将NSObject转成确定的类型的可选类型
/*
let item1 = infoArray[1]
let name = item1 as? String
if let name = name {
    print(name.characters.count)
}
 */
if let name = infoArray[0] as? String {
    print(name.characters.count)
}

// 2.3. as! 的使用 : 将NSObject转成确定的类型, 但是如果转化不成功, 则程序会崩溃
/*
let item1 = infoArray[0]
let name = item1 as! String
print(name.characters.count)
 */
let count = (infoArray[0] as! String).characters.count

函数

import UIKit

// 1.没有参数没有返回值的函数
func about() -> Void {
    print("iPhone8")
}
about()

func about1() {
    print("iPhone8")
}

// 2.有参数, 没有返回值的函数 +86
func callPhoneNum(phoneNum : String) {
    print("打电话给:" + phoneNum)
}

callPhoneNum("+86 110")

// 3. 没有参数, 有返回值的函数
func readNewMsg() -> String {
    return "吃饭了吗?"
}

let newMsg = readNewMsg()
print(newMsg)

// 4. 有参数有返回值的函数
func addTwoNums(num1 : Int, num2 : Int) -> Int {
    return num1 + num2
}

let result = addTwoNums(20, num2: 30)
print(result)

addTwoNums(20, num2: 39)
内部参数&外部参数

1.什么内部参数名称
1> 在函数内部可以看到的标识符就是内部参数
2> 默认情况下, 所有的参数都是内部参数

2.什么外部参数名称
1> 在函数外部可以看到的标识符就是外部参数
2> 从第二个参数开始, 都是外部参数. 但是第一参数默认不是外部参数
3> 如果希望第一个参数可以也是外部参数, 那么可以第一个参数的标识符前, 加上第一个参数的外部参数名称
4> 如果希望后面的参数不是外部参数, 可以在标识符前加上 _

func sum(num1 num1 : Int, num2 : Int, num3 : Int) -> Int {

    return num1 + num2 + num3
}

sum(num1: 20, num2: 30, num3: 40)
 */

/*
func sum(num1 : Int, _ num2 : Int, _ num3 : Int) -> Int {

    return num1 + num2 + num3
}

sum(20, 30, 40)
*/

// 了解
func sum(num1 num1 : Int, fdafdafad num2 : Int, num3 : Int) -> Int {

    return num1 + num2 + num3
}

sum(num1: 20, fdafdafad: 30, num3: 40)
函数特殊用法
//雀巢是默认咖啡
import UIKit

func makeCoffee(coffeeName : String = "雀巢") -> String {
    return "制作了一杯爱心\(coffeeName)咖啡"
}

let coffee1 = makeCoffee("拿铁")
makeCoffee("摩卡")

makeCoffee()
可变参数
func sum(nums : Int...) -> Int {

    var total = 0
    for num in nums {
        total += num
    }

    return total
}

sum(20, 30)
指针参数
import UIKit

var m = 20
var n = 30

func changeNum(inout num1 : Int, inout num2 : Int) {
    let temp = num1
    num1 = num2
    num2 = temp
}

changeNum(&m, num2: &n)

print("m:\(m) n:\(n)")
函数的嵌套,函数里面嵌套多个函数
func demo() {

    func test() {
        print("test")

        func test1() {
            print("test1")
        }

    }

    print("demo")
    test()
}

demo()
函数式编程,函数作为参数调用
// 1.定义两个函数
// 类型 (Int, Int) -> Int
func addTwoInts(num1 : Int, num2 : Int) -> Int {
    return num1 + num2
}

func multiplyTwoInts(num1 : Int, num2 : Int) -> Int {
    return num1 * num2
}

var abc : (Int, Int) -> Int = addTwoInts
abc = multiplyTwoInts
abc(20, 30)

func printResult(cba : (Int, Int) -> Int) {
    print(cba(20, 30))
}

printResult(multiplyTwoInts)
类比学习
// 20 --> Int
var m : Int = 20
m = 30
let result = m + 30

func printNum(m : Int) {
    print(m)
}

printNum(m)

// 30 --> Int

枚举

import UIKit

// 1.枚举的基本定义
enum Direction {
    case East
    case West
    case North
    case South
}

// 2.使用枚举类型

// 完整写法
let d : Direction = Direction.East

// 简便写法 : 根据上下文能推导出确定的类型
var d1 = Direction.East
d1 = .West

// 3.枚举类型的应用
let btn = UIButton(type: .Custom)

btn.addTarget(nil, action: "函数", forControlEvents: .TouchUpInside)

给枚举类型进行赋值
// 1.定义枚举类型  给枚举类型进行赋值
enum Direction : String {
    case East = "10"
    case West = "11"
    case North = "12"
    case South = "13"
}

var d : Direction = .North
d = .South

let d1 : Direction? = Direction(rawValue: "10")

// 2.定义枚举类型 : 太阳系的行星
enum Planet : Int {
    case waterxing = 0, earth, firexing, gelding//后面自动会添加底标
}

let p : Planet = .earth
let p1 : Planet? = Planet(rawValue: 2)//打印firexing   

结构体

import UIKit

let m : CGFloat = 10
let n : Double = 11

// 1.创建系统的结构体
let point = CGPointMake(100, 100)
let point1 = CGPoint(x: 10, y: 10)
let size = CGSizeMake(100, 100)
let size1 = CGSize(width: 50, height: 50)
let rect = CGRectMake(0, 0, 100, 100)
let rect1 = CGRect(x: 50, y: 50, width: 50, height: 50)

// 2.定义自己的结构体
struct Location {
    var x : Double
    var y : Double

    // 给自己的结构体扩充构造函数
    // 1.如果没有自定义构造函数, 那么系统也会提供一个默认的构造函数
    // 如果有自定义构造函数, 那么会覆盖掉系统的构造函数. 如果不希望被覆盖, 则需要明确的实现
    init(x : Double, y : Double) {
        self.x = x
        self.y = y
    }

    // 2.自定义的构造函数

    init(x : Int, y : Int) {
        self.x = Double(x)//要转
        self.y = Double(y)//要转
    }

    init(x : CGFloat, y : CGFloat) {
        self.x = Double(x)//要转
        self.y = Double(y)//要转
    }

    init() {
        x = 0
        y = 0
    }
}

let l : Location = Location(x: 50, y: 50)
print(l)

在结构体里面写函数并修改成员属性
mutating : 如果函数中有修改成员属性, 那么函数前必须加上mutating
import UIKit

struct Location {
    var x : Double
    var y : Double

    func test() {
        print("-----")
    }

    // mutating : 如果函数中有修改成员属性, 那么函数前必须加上mutating
    mutating func moveH(distance : Double) {
        self.x += distance
    }
}

var l = Location(x: 20, y: 30)
l.moveH(-10)

swift中的类

/ 1.定义类
class Person {
    // 对象类型, 声明称可选类型
    // 值类型, 赋值初始化值
    var name : String = ""
    var age : Int = 0
}

// 2.创建类对应的对象
//let view : UIView = UIView()
let p : Person = Person()
p.name = "Kobe"
p.age = 18
print(p.name)
print(p.age)

存储属性/计算属性/类属性
import UIKit

class Student {
    // 存储属性 : 存储一些值
    var name : String = ""
    var age : Int = 0
    var mathScore : Double = 0.0
    var chineseScore : Double = 0.0

    /*看看就好
    func getAverageScore() -> Double {
        return (mathScore + chineseScore) * 0.5
    }
    */

    // 计算属性 : 通过某种方式计算得到结果的属性就是计算属性
    /*完整写法,看看就好
    var averageScore : Double {
        set {

        }
        get {
            return (mathScore + chineseScore) * 0.5
        }
    }

    */

                    
    var averageScore : Double {
        return (mathScore + chineseScore) * 0.5
    }

    // 类属性 : 和整个类相关的属性, 并且是通过类名访问
    // 类属性的定义是使用static
    static var courseCount : Int = 0
}

let stu = Student()
stu.name = "Kobe"
stu.age = 18
stu.mathScore = 99
stu.chineseScore = 80

let averageScore = stu.averageScore

// 访问类属性
Student.courseCount = 2

类的构造函数
class Person {
    var name : String = ""
    var age : Int = 0

    // 系统默认提供
    // 如果有自定义构造函数, 那么会覆盖掉系统提供的构造函数

    // 如果不希望被覆盖, 则需要明确时限
    //系统默认
    init() { 

    }

    // 如果在一个方法中, 属性名称产生了歧义(重名), self.不可以省略
    init(name : String, age : Int) {
        self.name = name
        self.age = age
    }

    init(dict : [String : NSObject]) {
        if let name = dict["name"] as? String {
            self.name = name
        }

        if let age = dict["age"] as? Int {
            self.age = age
        }
    }
}

let p = Person()
p.name = "Kobe"
p.age = 18

let p1 = Person(name: "yz", age: 19)
print(p1.name)
print(p1.age)

let p2 = Person(dict: ["name" : "Kobe", "age" : 18])
print(p2.name)
print(p2.age)

KVC

/*
 使用KVC的条件
    1.必须继承自NSObject
    2.如果是在构造函数中使用, 那么必须先调用super.init()
 */

class Person : NSObject {
    var name : String = ""
    var age : Int = 0

    init(dict : [String : NSObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)

    }
     //重写override,因为里面数组里面添加了未定义的属性-》"height" : 1.88
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
}

/*
let p = Person()

p.setValuesForKeysWithDictionary(dict)

print(p.name)
print(p.age)
 */

let dict = ["name" : "Kobe", "age" : 18, "height" : 1.88]
let p = Person(dict: dict)

print(p.name)
print(p.age)

析构函数

import UIKit

class Dog {
    var weight : Double = 0.0

    // 析构函数
    deinit {
        print("Dog已经销毁")
    }
}

var d : Dog? = Dog()

d = nil

相关文章

网友评论

  • 贝尔特伦:你的第三炮什么时候出来?
    贝尔特伦:@贝尔特伦 如果你里面用了Swift写的第三方,就全部换为oc的第三方,让后无法自动更新下,看看有没有问题,应该是没问题的。
    子祖:@贝尔特伦 用swift写了一个直播,思考一下要不要发出来,因为可恶的xcode8
  • 9648f522204f:你好,请问有的方法打印 为Function 是什么意思啊
    9648f522204f:@西夏ci 好吧 找到原因了,2了,表示打印的是方法,应该用个值来接受

本文标题:三日上手swift(第二日)会陆续更新到项目

本文链接:https://www.haomeiwen.com/subject/mytmsttx.html