Swift-基础语法(上)

博客围绕Swift语言展开,涵盖语法入门和运算符相关内容。语法部分介绍了常量与变量、整型、浮点型等多种类型及类型转换、断言等。运算符部分包含基础、高级和自定义运算符,还说明了运算符优先级和结合性。

思维导图

引用:《Swift语言实战入门》

在这里插入图片描述

语法入门

  • 常量与变量
        var sampleStr0:String
        let sampleStr1:String = "hello,"
        let sampleStr2="world."
        sampleStr0=sampleStr1+sampleStr2
        print(sampleStr0)
  • 整型
        var sampleInteger:Int
        sampleInteger=4
        var tmpInteger0=12
        tmpInteger0+=1
        var tmpInteger1=Int.init(3)
        tmpInteger1+=1
        let tmpInteger2=Int.init("24")
        
        print(sampleInteger,tmpInteger0,tmpInteger1,tmpInteger2!)
  • 浮点型
        let sampleValue=1.2 //变量或常量总是默认被推断为Double类型
        var tmpDouble:Double
        tmpDouble=sampleValue+1.5
        //Double 64位浮点数 Float 32位浮点数,使用类型别名防止Double和Float字长混淆
        typealias Float32 = Float
        typealias Float64 = Double
        let tmpFloat32:Float=1.2
        print(tmpDouble,tmpFloat32.magnitude)
  • 布尔型
        var sampleBoolValue:Bool
        let tmpBool=true
        sampleBoolValue=tmpBool&&false
        print(sampleBoolValue)
  • 字符串与字符
 //字符串
        var sampleString:String
        let keyNote="someNote"
        if !keyNote.isEmpty{
            print(keyNote)
        }
        sampleString=keyNote+"is not null"
        print(sampleString)
        //插值
        let gameName="flappy bird"
        print("The game i played is \(gameName)")
        
        //字符
        var myChar:Character
        myChar="^"
        let doller:Character="$"
        print(myChar,doller)
        // lengthOfBytes
        let Title="Swift is new oop language for iOS and OS X development."
        print("Title has \(Title.lengthOfBytes(using: String.Encoding.utf8)) characters")
        // hasPrefix
        if Title.hasPrefix("Swift")
        {
            print("yes")
        }
        // hasSuffix
        if Title.hasSuffix("development.")
        {print("yes")}
        // uppercased \lowercased
        print(Title.uppercased(),Title.lowercased())
        // Unicode
        let animalString="a: "
        for  codeUnit in animalString.utf8
        {
            print(codeUnit)
        }
        for  codeUnit in animalString.utf16
        {
            print(codeUnit)
        }
        for  codeUnit in animalString.unicodeScalars
        {
            print(codeUnit)
        }
  • 可选(Optional)
  //定义可选变量
        var roundValue:Int?
        print(roundValue?.description as Any)  //nil
        roundValue=13
        print(roundValue?.description as Any)  //Optional("13") 等同于 type?
        print(roundValue!.description)   //13
        /*
         可选类型定义:可选类型是使用范型枚举的形式组织的。
         可以运用于 类型、结构体、类或者其他复杂数据类型
         
         public enum Optional<Wrapped> : ExpressibleByNilLiteral {
         /// The absence of a value.
         ///
         /// In code, the absence of a value is typically written using the `nil`
         /// literal rather than the explicit `.none` enumeration case.
         case none
         
         /// The presence of a value, stored as `Wrapped`.
         case some(Wrapped)
         ...}
         */
        
        //范型方式定义可选类型变量;使用前需要初始化
        var roundValue2:Optional<Int>
        roundValue2=33
        
        ///可选类型可以赋值为nil
        ///Objective-C中 nil 为指向不存在对象的指针
        ///Swift中 表示为空的关键字nil,没有其它含义
        roundValue2=nil
        print(roundValue2?.description as Any)
        
        
        //可选是一种十分强大的类型安全机制
        //var optionalValue:Optional<Int>
        //optionalValue=nil
        var optionalValue:Int?
        if var MaxValue = optionalValue
        {//安全机制:当可选变量optionalValue不为nil时成功声明MaxValue,执行if中语句体;可以避免使用值为nil的对象。
            MaxValue+=1
            print(MaxValue)
        }
        
        //隐式解析可选
        let nullValue:String!="ac"
        print(nullValue.description)
        //双重可选"??";与可选运算符要区分开( var a=b??c //如果b为nil则把c赋值给a,否则把b赋值给a  )
        var doubleOptionalValue:Int??
        doubleOptionalValue=10000
        print(doubleOptionalValue)//Optional(Optional(10000))
        var tripleOptional:Int???
        tripleOptional=1344
        print(tripleOptional)//Optional(Optional(Optional(1344)))
        
  • 元组
        ///使用元组可以把不同的值组合到一起(元组可用于函数返回值,可以使函数一次返回更多信息)
        ///匿名元组:使用元素名来访问
        let (appType,appName)=("game","flappy brid")
        print(appType,appName)
        ///标准元组定义
        let myProject=(oneElement:12,twoElement:"ok")
        print(myProject.oneElement,myProject.1)
  • 类型别名
        typealias ShortInt = Int8
        let age:ShortInt=18
        print("I am \(age) years old")
        
  • 类型转换
        let k=Int(12.4)
        print(k)
  • 断言
        //参数也可以是表达式,此表达式会被自动封装成闭包
        assert(false, "bool值为false时程序终止;且适用于Debug模式")

运算符

  • 基础运算符
        //赋值运算符
        let a = 5
        var b:Int;
        b=a
        print(b)  //5
        //算术自反赋值运算符:“+=”、“-=”、“*=”、“/=”、“%=”
        b+=5
        print(b) //10
        b-=2
        print(b) //8
        b*=2
        print(b) //16
        b/=3
        print(b) //5
        b%=2
        print(b) //1
        //单目负号和单目正号
        b = -a   //"=" 与“-”之间有空格
        print(b) //-5
        //算术运算符:“+” 、“-” 、“*” 、“/” 、“%”
        var x=5+6
        var y=10-4
        let z=2.0*6.5
        print(x,y,z)
        x=x/3
        print(x,y,z)
        y=x%2
        print(x,y,z)
        //自增自减
        var autoAdd=1
        autoAdd+=4
        print(autoAdd)
        autoAdd-=1
        print(autoAdd)
        //字符连接符
        var str0="hello "
        var str1="world "
        var intValue=10
        print(str0+str1+String(intValue))
        //关系运算符
        ///"==",“!=”,“>”,">=","<","<=","==="(恒等,判断两个对象是否引用同一个类实例,引用为真),“!==”(不恒等,判断两个对象是否不引用同一个类实例,不引用为真)
        
        //三目条件运算符
        var ta=33
        var tb=23
        var someValue=ta>tb ? ta:tb
        print(someValue)
        
        //区间运算符
        ///闭区间运算符
        for i in 0...10
        {
            print(i) //包括0和10;输出: 0.....10
        }
        ///半闭区间运算符
        for i in 0..<10
        {
            print(i) //包括0但不包括10;输出:0.....9
        }
        //逻辑运算符
        ///逻辑非运算符“!”
        let NoAllow=true
        let changeAllow = !NoAllow
        print(changeAllow)  //false
        ///逻辑与运算符“&&”
        let la=true
        let lb=false
        let lc=true
        let ld=false
        print(la&&lb,la&&lc,lb&&ld) //false true false
        //逻辑或运算符 “||”
        let ora=true
        let orb=false
        let orc=false
        print(ora||orb,orb||orc) //true false
        

  • 高级运算符
        //高级运算符 
        //-----代码片段定义在Class外部     
        import Foundation
        struct CP{
            var x=0,y=0
        }
        func + (left: CP,right: CP) -> CP
        {
            return CP(x: left.x+right.x,y: left.y+right.y)
        }
        func += ( left: inout CP,right: CP){
            left = left + right
        }  
        //------代码片段 定义在 func中 
        // 位运算符
        ///按位取反运算符“~” :对操作数的每一位取反
        let tmpBit:UInt8 = 0b11111111
        let tmpBit2 = ~tmpBit
        print(tmpBit,tmpBit2)  //255  0
        ///按位与运算符“&” :都是1时才是真
        let oneBits:UInt8 = 0b11001100
        let twoBits:UInt8 = 0b00111001
        print(oneBits&twoBits,5&0b0001101,5&13)  //0b00001000   =  8 ,5,5
        ///按位或“|”  :只有有一个是1则为真
        print(oneBits|twoBits) //0b11111101 253
        ///按位异或“^”
        print(oneBits^twoBits) //0b11110101  245
        ///按位移动运算符“<<” 、 ">>" (用途:数列排序、奇偶校验、协议编码、编码解码)
        let m: UInt8 = 1  //0b00000001
        print(m)      //1
        print(m<<1)   //2
        print(m<<2)   //4
        print(m<<3)   //8
        print(m<<4)   //16
        print(m<<5)   //32
        print(m<<6)   //64
        print(m<<7)   //128
        print(m<<8)   //0
        
        ///有符号
        let n: Int8 = -1   //0b10000001  第一位0代表正数、1代表负数
        print(n)      //-1
        print(n<<1)   //-2
        print(n<<2)   //-4
        print(n<<3)   //-8
        print(n<<4)   //-16
        print(n<<5)   //-32
        print(n<<6)   //-64
        print(n<<7)   //-128
        print(n<<8)   //0  0b10000000
        
        //溢出运算符:溢出加法"&+"、溢出减法"&-"、溢出乘法"&*"
        let intMax=UInt8.max
        print(intMax) //255    11111111 + 1= 100000000  ->上界溢出取低位  为 00000000 = 十进制 0
        print(intMax&+1) //0
       
        let intMin=UInt8.min
        print(intMin) //00000000   0
        print(intMin&-1) //-1时 低位不足像高位借1  即:100000000 -1 =11111111 =255
        
        let k:Int8 = Int8.max  //有符号溢出的计算包括符号在内 !
        let kk:Int8 = k&+1   //01111111=127 +1 =》10000000=〉2^8 =128 (最高位计算在内了),又因为符号位是1为负数。==》结果 -128
        print(k,kk)  //127  -128
       //运算符重载和运算符函数(默认的赋值运算符“=”和三目条件运算符不可重载)
        let leftP:CP = CP(x:10,y:20)
        let rightP:CP = CP(x:1,y:30)
        var newP=leftP + rightP
        print(newP) //CP(x: 11, y: 50)
        //组合赋值运算符
        newP += newP
        print(newP)//CP(x: 22, y: 100)
  • 自定义运算符
    可以使用 /=-+*%<>!&|^~ 来组合构成新的运算符
       //-----代码块在Class外
        postfix operator +++
        //实现加上自己之后,再自增加1
        postfix func +++ (left: inout  CP)->CP
        {
            left += left
            left += CP(x:1,y:1)
            return left
        }
        //-----代码块在func内部
        var p0=CP(x: 2, y: 3)
        print(p0+++) //CP(x: 5, y: 7)
        
  • 运算符优先级和结合性

结合性(associativity)包含left(左结合)、right(右结合)、none(自动);

左结合运算符跟其他优先级相同的左结合运算符写在一起时,会跟左边的操作数结合。同理右结合会跟右边的操作数结合。而非结合运算符不能跟其他相同优先级的运算符写在一起。

结合性默认值为 none,优先级(precedence)默认值100

// 定义结合性为left,比加法优先级高的自定义运算符+-

//class外部代码块
precedencegroup ldg{
    associativity:left
    higherThan:AdditionPrecedence
}
infix operator +-:ldg
func +-(left:CP,right:CP)->CP
{
    return left
}

使用 +-

       //使用前边定义的变量:p0 最新值为= CP(x: 5, y: 7)
        var lp=CP(x: 10, y: 20)
        var rp=CP(x: 3, y: 44)
        //优先级为: higherThan:AdditionPrecedence
        var result:CP = lp +- rp  + p0  // 等价=> (lp +- rp)  + p0
        print(result)   // CP(x: 15, y: 27)
        //如果改优先级为: lowerThan:AdditionPrecedence
        var result2:CP = lp +- rp  + p0 // 等价=> lp +- (rp  + p0)
        print(result2)  // CP(x: 10, y: 20)
dnSpy是目前业界广泛使用的一款.NET程序的反编译工具,支持32位和64位系统环境。它允许用户查看和编辑.NET汇编和反编译代码,以及调试.NET程序。该工具通常用于程序开发者在维护和调试过程中分析程序代码,尤其在源代码丢失或者无法获取的情况下,dnSpy能提供很大的帮助。 V6.1.8版本的dnSpy是在此系列软件更新迭代中的一个具体版本号,代表着该软件所具备的功能与性能已经达到了一个相对稳定的水平,对于处理.NET程序具有较高的可用性和稳定性。两个版本,即32位的dnSpy-net-win32和64位的dnSpy-net-win64,确保了不同操作系统架构的用户都能使用dnSpy进行软件分析。 32位的系统架构相较于64位,由于其地址空间的限制,只能支持最多4GB的内存空间使用,这在处理大型项目时可能会出现不足。而64位的系统能够支持更大的内存空间,使得在处理大型项目时更为方便。随着计算机硬件的发展,64位系统已经成为了主流,因此64位的dnSpy也更加受开发者欢迎。 压缩包文件名“dnSpy-net-win64.7z”和“dnSpy-net-win32.7z”中的“.7z”表示该压缩包采用了7-Zip压缩格式,它是一种开源的文件压缩软件,以其高压缩比著称。在实际使用dnSpy时,用户需要下载对应架构的压缩包进行解压安装,以确保软件能够正确运行在用户的操作系统上。 dnSpy工具V6.1.8版本的发布,对于.NET程序员而言,无论是32位系统还是64位系统用户,都是一个提升工作效率的好工具。用户可以根据自己计算机的操作系统架构,选择合适的版本进行下载使用。而对于希望进行深度分析.NET程序的开发者来说,这个工具更是不可或缺的利器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值