应用程序需要引入import Cocoa。ios需要引入import UIKit

Swift不要求在每行结尾使用分号,但在同一行书写多条语句时,必须用分号隔开

数据类型

Int,UInt,Float,Double,Bool,String,单个字母:Character,可选类型:Optional,类型别名:typealias

变量的定义

var variableName= <intial value>
var varA = 40
print(varA)

var varB:Float = 3.1415
var varC = "hello"
//字符串
var stringA = "Hello,World!"
var stringB = String("Hello")
var stringC = stringA + stringB
var stringD = stringA.append(stringB)
if stringS.isEmpty{
  
}
print("\(stringC.count)")
//遍历字符串中的字符
for ch in "Runoob".characters {
    print(ch)
}

常量的定义

常量需要以字母或下划线开始

let constantName = <initial value>
let constA=40
let constB:Float = 3.14159

类型转换

//字符串转整型
let myString: String = "256"
let myInt: Int? = Int(myString)
//分割字符串
let fullName = "sf|ff|ss"
let fullNameArr = fullName.characters.split{$0 == "|"}.map(String.init)

枚举的定义

// 定义枚举
enum DaysofaWeek {
    case Sunday
    case Monday
    case TUESDAY
    case WEDNESDAY
    case THURSDAY
    case FRIDAY
    case Saturday
}
enum Student{
    case Name(String)
    case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Runoob")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
    print("学生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}

数组的定义

var someInts:[Int] = [10, 20, 30]
//创建数量为3,初始值为0
var someInts = [Int](repeating: 0, count: 3)
someInts.append(10)
someInts+= 20
someInts[1]=50
//计算个数
print(someInts.count)
//合并数组
var intsC = intsA+intsB
for (index, item) in someInts.enumerated() {
    print("在 index = \(index) 位置上的值为 \(item)")
}
//判断数组是否为空
intsA.isEmpty

字典

var someDict = [Int: String]()
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
someDict[1] = "hello"
//修改值,如果不存在则创建
someDict.updateValue("One 新的值", forKey: 1)
//移除值
someDict[1] = nil
someDict.removeValue(forKey: 1)
//遍历
for (key, value) in someDict {
   print("字典 key \(key) -  字典 value \(value)")
}
//我们也可以使用enumerate()方法来进行字典遍历,返回的是字典的索引及 (key, value) 对,实例如下:
for (key, value) in someDict.enumerated() {
    print("字典 key \(key) -  字典 (key, value) 对 \(value)")
}

//字典转数组
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

let dictKeys = [Int](someDict.keys)
let dictValues = [String](someDict.values)

print("输出字典的键(key)")

for (key) in dictKeys {
    print("\(key)")
}

print("输出字典的值(value)")

for (value) in dictValues {
    print("\(value)")
}

变量与常量的输出

let name = "常量1"
var age = "变量"
print("输出:\(name),\(\age)")

控制结构

条件控制

//if语句
if true{
  
}else if{
  
}else{
  
}
//switch语句
switch var{
  case 1:
  fallthrough //可选,如果使用了fallthrough 语句,则会继续执行之后的 case 或 default 语句,不论条件是否满足都会执行。
  case 2,3:
  default:
}
//三元运算
Exp1 ? Exp2 : Exp3;

循环控制

for index in var {
   循环体
}
while condition
{
   statement(s)
}
repeat
{
   statement(s);
}while( condition );

函数

语法

一般默认在函数中定义的参数都是常量参数,也就是这个参数你只可以查询使用,不能改变它的值。

如果想要声明一个变量参数,可以在参数定义前加 inout 关键字,这样就可以改变这个参数的值了。

func runoob(name: String, site: String) -> String {
    return name + site
}
print(runoob(name: "菜鸟教程:", site: "www.runoob.com"))
print(runoob(name: "Google:", site: "www.google.com"))
//可变参数
func vari<N>(members: N...){
    for i in members {
        print(i)
    }
}
vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Google", "Baidu", "Runoob")

函数类型

在 Swift 中,使用函数类型就像使用其他类型一样。例如,你可以定义一个类型为函数的常量或变量,并将适当的函数赋值给它:

func sum(a: Int, b: Int) -> Int {
   return a + b
}
var addition: (Int, Int) -> Int = sum
print("输出结果: \(addition(40, 89))")

函数类型作为参数类型、函数类型作为返回类型

func sum(a: Int, b: Int) -> Int {
    return a + b
}
var addition: (Int, Int) -> Int = sum
print("输出结果: \(addition(40, 89))")

func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
    print("输出结果: \(addition(a, b))")
}
another(addition: sum, a: 10, b: 20)

闭包

let studname = { print("Swift 闭包实例。") }
studname()
//以下闭包形式接收两个参数并返回布尔值:
let divide = {(val1: Int, val2: Int) -> Int in 
   return val1 / val2 
}
let result = divide(200, 20)
print (result)

//使用闭包排序
let names = ["AT", "AE", "D", "S", "BE"]

// 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = names.sorted(by: backwards)
print(reversed)

//缩写参数名
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)

结构体

struct MarksStruct {
   var mark: Int

   init(mark: Int) {
      self.mark = mark
   }
}
var aStruct = MarksStruct(mark: 98)
var bStruct = aStruct // aStruct 和 bStruct 是使用相同值的结构体!
bStruct.mark = 97
print(aStruct.mark) // 98
print(bStruct.mark) // 97

类定义

class student{
   var studname: String
   var mark: Int 
   var mark2: Int 
  init(){ //构造函数
    
  }
  deinit {//析构函数
        
  }
}
//判断两个类相等用===和!==
let spClass1 = SampleClass(s: "Hello")
let spClass2 = SampleClass(s: "Hello")
if spClass1 === spClass2 {// false
    print("引用相同的类实例 \(spClass1)")
}
//get set
var middle: (Double, Double) {
    get{
        return (length / 2, breadth / 2)
    }
    set(axis){
        no1 = axis.0 - (length / 2)
        no2 = axis.1 - (breadth / 2)
    }
}
var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)

//只读属性
class film {
    var head = ""
    var duration = 0.0
    var metaInfo: [String:String] {
        return [
            "head": self.head,
            "duration":"\(self.duration)"
        ]
    }
}

属性观察器

属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。
可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重载属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。

注意:

  • 不需要为无法重载的计算属性添加属性观察器,因为可以通过 setter 直接监控和响应值的变化。
  • 可以为属性添加如下的一个或全部观察器:
  • willSet在设置新的值之前调用
  • didSet在新的值被设置之后立即调用
  • willSet和didSet观察器在属性初始化过程中不会被调用
class Samplepgm {
    var counter: Int = 0{
        willSet(newTotal){
            print("计数器: \(newTotal)")
        }
        didSet{
            if counter > oldValue {
                print("新增数 \(counter - oldValue)")
            }
        }
    }
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

类继承

//final 关键字防止重写
class SomeClass: SomeSuperclass {
  //重写属性
  override var area: String {
      return super.area + " ,但现在被重写为 \(print)"
  }
  init() //构造函数
  {
      super.init(stm1: 93, results: 89)
  }
  //重写方法
  override func show() {
        print("这是子类 SubClass")
    }
}

协议(接口)

protocol SomeProtocol {
    
    var marks: Int { get set }
    var result: Bool { get }
    init(aprot: Int)
    func attendance() -> String
    func markssecured() -> String
    
}
class SomeClass: SomeProtocol {
   required init(someParameter: Int) {
      // 构造器实现
   }
}
class subClass: SomeClass, tcpprotocol {
    var no2: Int
    init(no1: Int, no2 : Int) {
        self.no2 = no2
        super.init(no1:no1)
    }
    // 因为遵循协议,需要加上"required"; 因为继承自父类,需要加上"override"
    required override convenience init(no1: Int)  {
        self.init(no1:no1, no2:0)
    }
}

附录

内置数据类型

标签: none

已有 12 条评论

  1. 《玻璃少女粤语》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/46381.html

  2. 《赛尔号》国产动漫高清在线免费观看:https://www.jgz518.com/xingkong/19413.html

  3. 《夜食男女》韩国剧高清在线免费观看:https://www.jgz518.com/xingkong/118476.html

  4. 《玻璃少女粤语》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/46381.html

  5. 《除(G)I-DLE以外小心轻放(录影带版)》日韩综艺高清在线免费观看:https://www.jgz518.com/xingkong/145841.html

  6. 《尼斯印象》记录片高清在线免费观看:https://www.jgz518.com/xingkong/4582.html

  7. 价值导向积极,彰显社会责任意识。

  8. 内容的丰富性和深度让人仿佛置身于知识的海洋,受益匪浅。

  9. 选材新颖独特,通过细节描写赋予主题鲜活生命力。

  10. 以终为始的思考方式为行业指明方向。

  11. 新项目准备上线,寻找志同道合的合作伙伴

  12. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

添加新评论