字符串
- 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")
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