美文网首页Swift学习
swift-基础-基本语法2

swift-基础-基本语法2

作者: 埃林的奶酪 | 来源:发表于2016-08-15 11:53 被阅读12次

    字符串

    • Swift中不用写@
    • Swift中的字符串不是对象,而是个结构体
    • Swift中的字符串的性能比OC中高
    • 虽然Swift的字符串是结构体,OC中是对象,但在Swift开发中可以在这两个数据类型中快速切换
    • 获取长度不再是length,现在是characters.count
    • 判断是否等于某个字符串直接用等于号if str == "123"
    • Swift字符串可以快速遍历
    var str = "lhj"
    for c in str.characters
    {
        print(c)
    }
    
    • 字符串拼接:Swift中不支持%@等占位符,改用反斜杠,或者用+连接
    let name = "lhj"
    let age = 29
    // 目标:输出name = lhj,age = 29
    //OC中:NSLog(@"name = %@,age = %d",name,age)
    print("name = \(name),age = \(age)")
    print("name = " + name + ",age = " + age)
    
    • 不支持占位符导致一个问题:比如希望保留两位小数,以前可以这么做%.2f,现在必须先转成字符串处理
    let value = 10.987654321
    let str = String(format:"%.2f",arguments:[value])
    print(str)
    let str2 = String(format:"%02d-%02d-%02d",arguments:[16,2,12])
    print(str2)
    
    • 字符串截取:比较难,建议先把Swift字符串转成OC字符串进行操作,再转回来(其它OC中的字符串方法而Swift中没有的也这么做)
    let str = "xiaomage"
    let str1 = str as NSString
    //或者let str1:NSString = str
    let str2 = str1.substringWithRange(NSMakeRange(0,4))
    //或者和并起来
    let str3 = (str as NSString).substringWithRange(NSMakeRange(0,4))
    //其它使用场景
    let str4 = "user/desktop/abc.txt"
    print((str4 as NSString).pathExtension)
    
    • 替换字符串
    urlStr = urlStr.stringByReplacingOccurrencesOfString("thumbnail", withString: "bmiddle")
    
    • 查看是否以xxx结尾 (并且忽略大小写)
    let flag = url?.absoluteString.lowercaseString.hasSuffix("gif")
    

    函数

    • 格式: func 函数名称(参数列表) -> 返回值类型 {}
    • func相当于OC中的短横-,class func相当于类方法+
    • 没有返回值没有参数
    func say() -> Void
    {
        print("hello")
    }
    say()
    // 如果没有返回值,Void可以用()代替 :func say() -> ()
    // 如果没有返回值,返回值类型也可以省略:func say()
    
    • 有返回值,没有参数
    fun getMax() -> Int
    {
        return 99
    }
    print(getMax())
    
    • 没返回值,有参数
    func sum(a: Int, b: Int)
    {
        print("sum = \(a + b)")
    }
    sum(10, b: 20) // 从Swift2.0开始,会自动将第二个参数开始的参数名称作为方法标签(比如这里的b)
    
    • 单独指定方法标签,提高阅读性
      • 可以在内部参数前面加上外部参数,加个空格
      • 这里width和height就是外部参数,为了提高阅读性
      • a和b是内部参数,为函数所使用
    func square(width a: Int,height b: Int)
    {
        print("square = \(a * b)")
    }
    square(width: 10, height: 20)
    
    • 默认值:如果某个参数有默认值,那么调用这个方法的时候这个参数可以忽略,使用默认值
      • 其它方法早就有默认值这个概念了,但其它语言中的默认值只能写在形参列表的最后面,Swift可以随便写在哪
    func square(width a: Int,height b: Int = 10)
    {
        print("square = \(a * b)")
    }
    square(width: 10)
    
    • 有返回值有参数
    func square1(width a:Int = 10, height b:Int = 20) -> Int
    
    {
    
        return a * b
    
    }
    
    square1()
    

    返回多个值:用元祖

        func calculateImageSize() -> (CGSize,CGSize) {
    
            
    
        }
    // 调用
    
    let (size1, size2) = calculateImageSize()
    

    泛型

    • 具体是什么类型,由调用者确定:传递的是什么类型,那么就是什么类型
    • 如果想在函数中使用泛型,那么必须告诉系统这是一个泛型函数
    func 函数名称<T>(形参列表) -> 返回值类型
    {}
    func KSLog<T>(message: T, fileName: String = #file, methodName: String = #function, lineNumber: Int = #line) {
    
        let haha = (fileName as NSString).pathComponents.last!.componentsSeparatedByString(".").first!
    
        
    
        print("\(haha) - \(methodName)[\(lineNumber)]:\(message)")
    
    }
    // 调用者可以使用任意类型的"message"
    KSLog("卧槽")
    
    KSLog([Int]())
    

    修饰符

    • 控制器A中有个方法MM,外界比如控制器B,只要拿到控制器A就可以使用这个MM方法。Swift针对这个现象加了处理办法:方法前面加private修饰
      • internal:默认权限,在同一个framework内都可以访问。什么都不写就是这个。
      • private:只能在当前文件访问
      • public:最大权限,可以在整个工程访问
      • 这些修饰符可以修饰属性、方法、类。在企业开发中建议严格控制权限,勤加private
      • 注意:举例:别的控制器的按钮A添加点击方法click,click前面加private修饰,会报错。因为click是运行循环触发的,不是当前类。而相同情况在OC中没有问题,因为OC是动态派发的,而Swift中所有东西都是在编译的时候确定的(更快)。这里的解决方法是在前面再加@objc,意思是让该方法兼容OC(也支持动态派发)
        • addtarget的方法如果是private的也会有这个问题,要加@objc

    相关文章

      网友评论

        本文标题:swift-基础-基本语法2

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