swift-基础-基本语法2

字符串

  • 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 函数名称(形参列表) -> 返回值类型
{}
func KSLog(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)