swift基础知识点


  var b : Book? = Book() 。
  • 这里的b就是对象,就是指针,用于存储地址。相当于 Person *p = [[Person alloc] init],创建出来的p。这里的p就相当于b

swift注意点

  • swift中如果定义一个标识符.必须告诉编译器该标识符是一个变量还是一个常量。这时候分别用到了两个修饰符
    • var:修饰变量的修饰符
    • let:修饰常量的修饰符
  • swift调用方法用的都是点语法,没有[a b]的形式了
  • 不能给常量赋值,能给变量赋值

swift类型推导

- let centerX = 100  // 不写标识符类型,底层自动类型推导,得到的是Int
- let cneterX : double = 100 // 写标识符类型,底层不再自动类型推导,就根据你写的类型,得到double

精华拓展:
let btn:UIButton = UIButton() 等价 let btn = UIButton()  // 1

区别 UIButton()  // 2

1是用类创建了一个对象, 2是直接调用UIButton方法
1默认调用init方法

常量的使用注意

  • 注意一:在开发中,apple建议优先使用常量,只有发现需要修改时再改成变量
  • 注意二:常量的本质:指向的内存地址不可以修改,但是可以通过内存地址获取到对象,之后修改对象内部的属性

例子:

let rect = CGRectMake(0, 0, 100, 100)
let view:UIView = UIView(frame: rect) // 创建view的对象
view.backgroundColor = UIColor.orangeColor() // 修改对象内部的属性

let btnRect = CGRectMake(0, 0, 50, 30)
let btn:UIButton = UIButton(frame: btnRect) // 创建btn对象
btn.backgroundColor = UIColor.blueColor() // 修改对象内部的属性
btn.setTitle("按钮", forState: .Normal)  // 修改对象内部的属性
// 将btn添加到view中
view.addSubview(btn) // oc中使用[view addSubView:btn],swifit中替换成了点语法

最终效果:

51-01.png

简写


修饰常量的修饰符 标识符(对象)的名称:标识符类型 = 创建对象
let view:UIView = UIView(frame: rect)    // 标识符类型放在标识符后面,即 view:UIView

修饰变量的修饰符 标识符(对象)的名称:标识符类型 = 创建对象
var view:UIView = UIView(frame: rect) 

let m : int = 20 等价 let m = 20(可以省略int,自动识别哦,实际上底层利用了类型推导,根据后面的类型,判断前面的类型)
let n :double = 3.14 等价let n = 3.14 
let btn:UIButton = UIButton() 等价 let btn = UIButton()

let btn:UIView = UIButton()   // UIButton 是UIView的子类,所以也可以这样写

---
两种写法(简写+繁写):.Normal是不写Normal的类型的形式.
          UIControlState.Normal是写Normal的类型的形式.
setTitle(title,forState:.Normal)// 全写:setTitle(title, forState: UIControlState.Normal)  

swift中两个不同类型的常量不能相加,不能相乘,必须转类型。因为没有隐式转换

  • oc中的隐式转化:在Int类型和Double进行基本运算(加减乘除)时,会自动将Int类型转成Double
let a = 20
let b = 30.5
let tmpA = Double(a) //将整形a转成浮点型
let result = tmpA + b

---

let a = 20
let b = 30.5
let tempB = Int(b) // 将浮点型b转成整形
let result1 = a + tempB

swift和OC的if的区别

  • 等同 swift和OC的while的区别
  1.swift中if后面的()可以省略
  2.swift中if没有非0即真,必须有明确的Bool -> true/false

// 错误写法:因为swift中if没有非0即真,所以下面不能写成if a,否则会报错.
//而if a这行代码在oc中表示,a > 0,因为a的值为20嘛,所以在oc中不会报错
let a = 20

if a  {
    print("a大于0")
} else {
    print("a不大于0")
}

// 正确写法: 必须指定 a > 0还是 a < 0  还是 a == 0 
let a = 20

if a > 0  {
    print("a大于0")
} else {
    print("a不大于0")
}



swift和oc中的switch的区别


1,2,3,4,5是swift中的switch case:

1.switch后面的(),可以省略不写
2.switch中的case的后面,不用加break,系统底层会自动加上break
3.switch后面的参数支持浮点型,字符串类型,所以case后面可以为浮点型和字符串类型,因为case后面的值的类型是和swtich后面的参数的类型是一致的(一直以来的规定)
4.switch中的case后面跟多个条件时,多个条件以,进行分割
5.switch中的case后面支持区间类型


---switch后面的参数支持浮点类型+多个条件用都好分隔开----

let sex = 0.5  //系统底层自动判断为浮点类型

switch sex {
case 0.5,0.8,20:  // 多个条件
    print("男")
case 0.7:
    print("女")
default:
    print("其他")
}


---浮点类型+switch中的case后面支持区间类型+逗号分隔多个条件----


let sex = 0.4

switch sex {
case 0.2...0.3: //区间是 0.2 ≤ sex ≤ 0.5
    print("男")
case 0.4..<0.6: //区间是  0.4 ≤ sex < 0.6
    print("女")
default:
    print("其他")
}

输出结果为:女


-----------switch后面的参数支持字符串类型----------

let m = 20
let n = 30

var result = 0

let opration = "+"

switch opration {
    case "+":
        result = m + n
    case "*":
        result = m * n
    case "-":
        result = m - n
    case "/":
        result = m / n
    default:
        print("非法操作符")
}

print(result)

输出结果为:50

  • 泛型集合必须必须指定类型
  • 可变数组和可变字典,必须得创建,利用[NSMubtableArray array];
    [NSMutableDictionary dictionary]这种形式创建,这样才能往里面存对象

  • 注意:两个数组中内容的类型一致,可以进行相加合并,两个字典中内容的类型一致,不可以进行相加合并.

  • 不懂:为什么定义字典用[] 还有什么时候用{ }

  • 对象类型可以赋值nil,普通类型可以赋值为0


guard用法

/*
 guard的使用
    1.如果条件表达式为真,则会执行后面的语句
    2.如果条件表达式为假,则会执行else后面的{}中的语句
*/

// guard条件为真:年龄大于18,继续判断是否带了身份证,继续判断是否带了钱,如果都满足,就能上网
// guard条件为假: 年龄小于18,直接执行紧随其后的else,所以打印“回家去”,然后退出程序,不再往下执行
func online(age : Int) {
    // 1.判断年龄
    guard age > 18 else {
        print("回家去")
        return
    }
    
    // 2.判断是否带了身份证
    guard 带了身份证 else {
        print("回家拿身份")
        return
    }
    
    // 3.判断是否带钱了
    guard 带了钱 else {
        print("回家拿钱")
        return
    }
    
    // 语句块
    print("开机上网")
}



swift利用for循环打印内容+条件的简写

// 写法1:
// 打印结果:0,1,2,3,4,5,6,7,8,9
for var i = 0; i < 10; i++ {
    print(i)
}

// 写法2:
// 打印结果:0,1,2,3,4,5,6,7,8,9(包括0,因为是左闭右开)
for i in 0..<10 {
    print(i)
}

// 写法3: 如果i不需要使用可以使用_来代替
// 打印结果:10个hello swift
for _ in 0..<10 {
    print("hello swift")
}

// 写法4: 如果i不需要使用可以使用_来代替
// 打印结果:11个hello swift
for _ in 0...10 {
    print("hello swift")
}



swift字符串基本使用

51-02.png

swift字符串截取

51-03.png

swift数组基本使用

51-04.png

swift遍历数组

51-05.png

swift字典基本使用

51-06.png

swift遍历字典

51-07.png

元组的使用

51-08.png

可选类型作用

51-09.png

特别注意:

  • 以下面截图1的方式创建Swift的playground文件和以截图2的方式创建Swift文件是有区别的
  • 截图1
51-10.png
  • 截图2
51-11.png
  • 总结:
  • 1.Swift文件,访问属性必须写在类的函数体{}内,不能在函数体外访问属性.函数体不是最外层的{}哦
  • 2.playground就没有这样的限制,playground只是让你体验一下的,让你玩一下的,所以要求不严格。

swift中,函数名后面一定有(),浪费 4小时


函数是系统底层的函数,一定在函数前面加override(重写)


class Person:NSObject{
 override init(){
        
    }
}



函数是自己定义的函数,函数前面不要加override


func myInfo(name : String,age : Int, score : Double){
    print("myInfo:name:\(name),age:\(age),score:\(score)")
    
    }

声明属性一定要写在当前类的最外层的{ }

class Person:NSObject {
    var name : String = " "
    var age  : Int = 0
    var score :Double = 0.0
}


访问属性,修改属性,不要写在当前类的最外层的{}

错误做法
class Person:NSObject {
    // 声明age并初始化age属性
    var age  : Int = 0
    
    let p = Student()
    // 访问age属性
    p.age = 100  // 提示 Expected declaration 错误
    
}


访问(修改)属性的代码一定要写在函数体里面,写在哪个类的函数体里面都可以[已验证]

  • 例1:访问age属性的代码写在Person类的zb函数体里面

class Person:NSObject {
    // 声明age并初始化age属性
    var age  : Int = 0
    
    func zb(){
    let p = Student()
    // 访问age属性
    p.age = 100  
    }
}

  • 例2:访问age属性的代码写在ViewController类的viewDidLoad函数体里面

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let a = Student()
        a.age = 10
    }

}


声明自定义的函数,既可以写在Student类中,也可以写在Student的类扩展中

  • 声明自定义的myInfo函数,写在Student类中

class Student: NSObject {
    func myInfo(name : String,age : Int, score : Double){
        ...............
    }
}


  • 声明自定义的myInfo函数,写在Student的类扩展中
extension  Student{
    func myInfo(name : String,age : Int, score : Double){
        ...............
    }

}


Swift也分对象函数和类函数

  • 效果截图
51-12.png

详情代码:

Student.swift文件

import UIKit

class Student: NSObject {
    var name : String = " "
    var age  : Int = 0
    var score :Double = 0.0
    
    func myInfo(name : String,age : Int, score : Double){// 1 对象函数
    print("myInfo:name:\(name),age:\(age),score:\(score)")
    
    }
    class func lsInfo(name : String,age : Int, score : Double) {// 2 类函数
         print( "lsInfo:name:\(name),age:\(age),score:\(score)")
    }
    // 修改age属性写在函数体外面,所以会报错。写在1,2,3,4,5,6函数体里面不会报错
   // let p = Student()
   // p.age = 10

}

// 类扩展:Student类的扩展。等价于OC的分类Category
extension  Student{
   // 类扩展中不能扩充属性,只能扩充函数,所以你声明属性sex提示错误
   // var sex : String = " "
        func mz(name : String,age : Int, score : Double){// 3 对象函数
     print("mzInfo:name:\(name),age:\(age),score:\(score)")
    }
       class func ww(name : String,age : Int, score : Double){// 4 类函数
        print("wwInfo:name:\(name),age:\(age),score:\(score)")
    }

    private func ml(name : String,age : Int, score : Double){ // 5 私有的对象函数
        print("mlInfo:name:\(name),age:\(age),score:\(score)")
    }
}
func test() { // 6
    let p = Student()
    p.myInfo("100", age: 22, score: 20)
    // 修改age属性属于test()函数中的内容,所以不会报Expected declaration的错误
    p.age = 250
    print(p.age)
}

ViewController.swift文件

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

推荐阅读更多精彩内容