博客> swift5分钟语法速记
swift5分钟语法速记
2019-04-18 14:53 评论:0 阅读:158 三吉i

更多专栏尽在原文地址

iOS 中的设计模式 (Swift版本) Part 1

又把swift相关语法部分看了一遍,并整理了swift语法速记,帮助我们快速记住swift语法和查找对应语法。

(一)类型 常见类型 Int,String,Double,struct,enum,class,tuple

//typle 元组类型 //声明 let someTuple:(Int,Int) = (10,23) //元组可以设置名称 var person = (name:"liuyw",age:30) //取值方式1 person.0 person.1 //取值方式2 person.age person.name //取值方式3 var (personName,personAge) = person personName personAge

someTuple.0或者tuple.1

//typealias //类型的别名关键字

//函数类型 func

//可选类型 var num:Int? = nil var num1:Optional = nil

//隐式解析可选 var num:Int! var num1:ImplicitlyUnwrappedOptional

//协议合成类型 var someProtocol:protocol

Array //声明 var array1:[String] = ["0","1","2","3"] var array = [String]()

//修改值 array1 += ["4","5"] array1[1...3] = ["a","b","c","d","e"] //array1.append //array1.removeAtIndex() //array1.insert(, atIndex:)

//获取值 print(array1) print(array1[0]) print(array1.last) print(array1.first)

var str:String = ""

//遍历 for item:String in array1{

}

for bgen in array1.enumerate() { print("元素下标:(bgen.0) 元素值:(bgen.1)") }

dictionary

//声明 var dic:Dictionary = ["name":"liu","age":"30"] var dic1 = Dictionary()

//修改值 dic["name"] = "liuyanwei" dic["name1"] = "liuyanwei1" dic.updateValue("liuyw", forKey: "name")//返回原值 dic1.indexForKey("name1") dic.removeValueForKey("name")

//获取值 dic["name"]

//字典的循环 for (key,value) in dictionary{ println("key is: (key) value is : (value)"); }

枚举enum

//整形的枚举 enum Sharp:Int{ case Rect=1,Circle,Star //switch中的选项可以用.表示 func desc()->String{ switch self{ case .Rect: return "this is rect" case .Circle: return "this is circle" case .Star: return "this is star" } } } //enum的值 Sharp.RawValue(1) //调用枚举的方法 Sharp.Rect.desc()

结构struct //结构 //结构和类的最重要的区别就是架构是传值,类是传引用 struct Sharp{ //属性 var width:Int var height:Int //方法 func area()->Int{ return self.width*self.height; } //允许修改属性的方法前缀 mutating mutating func zoomIn() { self.width += 100 self.height += 100 } }

协议

//可以被class,struct,enum实现 protocol Sharp{ //属性 var width:String{get} var heiht:String{get set} //方法 func area()->Int

}

//swift 可选和必选协议 //只能被class实现,无法给struct和enum实现 @objc protocol OptionalProtocol { //可选协议 optional func optionalMethod() //必选协议 func necessaryMethod() }

对象 class Card: NSObject {

} class Person: NSObject {

//私有对象
private var _name:String?

var gender:String
var gender1:String?

//arc
/*
weak 用于可空对象,unowned用于非空对象
weak 调用被释放的对象会返回nil,unowned 调用被释放的对象会出异常
建议 如果能够确定在访问时不会已被释放的话,尽量使用 unowned,如果存在被释放的可能,那就选择用 weak
*/
weak var bastFriend:Person?
unowned var identityCard:Card

//构造函数
init(name: String) {
    gender = "male"
    identityCard = Card()
    super.init()
    //初始化。。。
    self.name = name
}
//便利构造函数
convenience init(name:String,gender:String)
{
    self.init(name:name)
    self.gender = gender
}

//析构函数
deinit{

}

//属性
var name:String{
    get{
        return _name!
    }
    set{
        _name = newValue;
    }
    //可以自定newValue的名称
    //set(newName){
    //   _gender = newName
    //}
}

//观察者模式的属性
//newValue 和 oldValue
var age:Int = 0{
    willSet{}
    didSet{}
}

//方法
func sayName(){
    print("hello name")
}

//静态方法
static func say(){
    print("hello")
}

//类方法
class func say1(){
    print("hello1")
}

//方法重载
override func copy() -> AnyObject {
    return ""
}

//懒属性
//两种方式,方法加载和闭包加载
lazy var friends:[String] = self.findfriends()
func findfriends()->[String]{
    return ["bob","bill","jobs"]
}
lazy var bastFirends:String = {
    print(" print bastFirends")
    return "liuyanwei"
    }()
//调用
//NSLog("bastFirends:%@ and friends is:[%@] ",p.bastFirends,p.friends)

//下标脚本
subscript(name:String)->String{
    get{
        return self.name
    }
    set{
        self.name = newValue;
    }
}

}

(二)语法 流程控制 if语句

//判断是Option类是否有值 if let theStr = str2 { print("ture") }

switch //switch 数字区间 var condition1 = 888_888_888; switch condition1{ case -999_999...38: print("case1"); case 40...88: print("case2"); case 100...188: print("case3"); case 200...999_999_999_999: print("case3"); default:break; }

//switch 元组 var condition2 = (100,88); switch condition2{ case (-99999...0,-99999...0),(40...88,0..<100 xss=removed>50 :print("case2") default :break; }

//switch 枚举 enum BarCode{ case UPCA(Int,Int,Int) case QRCode(String) } var condition4 = BarCode.UPCA(10, 5, 2) switch condition4{ case let .UPCA(a,b,c): print("a:(a)|b:(b)|c:(c)") case .QRCode: print("case:2") // default: break }

//对option的判断 let num: Int? = nil switch num { case nil: println("没值") default: println("(num!)") }

函数

//无参数 func hello(){}

//有参数 func hello(name:String){}

//有参数和返回值 func hello(name:String)->String{}

//多个参数 func hello(name:String,age:Int){}

//多个返回值 func hello()->(String,Int){ return (num1,num2,num3) }

//可变参数 func hello(name:String...){}

//函数的嵌套 func hello1(){ func hello2(){} }

//参数的默认值 func hello1(msg:String = "defaultMsg"){}

//返回值是函数 func hello()->(String->String){ func hello1(name:String)->String{} return hello1 }

//参数是函数 fun hello(msg:String,callback(Void->Void)){ callback() }

//函数参数是变量 //若不声明var ,默认参数类型是let,就无法修改参数的值 func hello(var msg:String){ msg += "hello" print(msg) }

//函数参数的命名 func hello(name name:String ,withAge age:Int){} func hello1(name:String ,age:Int){} //调用 hello(name:, withAge:)//默认的参数命名 hello1(, age: )//指定的参数命名

//匿名函数 //{}可以作为匿名函数 //例如调用上面的hello方法(参数是函数) hello("hi", { //dosthing } )

//有参数的匿名函数 { (msg:String)->String in return msg }

//泛型参数 //输入输出参数的函数 func myswap(inout obj1:T,inout _ obj2:T){ let temp:T = obj1 obj1 = obj2 obj2 = temp }

闭包

var array = ["f","a","c","d","e"]

//完整写法 //{ (参数:类型) in 执行方法 return 返回值} array.sort({ (s1:String,s2:String) -> Bool in return s2 > s1; })

//省略参数类型和括号 //{ 参数$1,$2 in 执行方法 return 返回值} array.sort({ s1,s2 -> Bool in return s1 > s2; })

//省略参数类型和return关键字 //{ 参数$1,$2 in 返回值} array.sort({ s1,s2 ->Bool in s1 < s2>(()->Int){ var i = 0; return { ()->Int in return ++i } } //测试使用 var touch = count() touch()//1 touch()//2 touch()//3 touch()//4

异常处理 enum AwfulError: ErrorType { case Bad case Worse case Terrible }

func hello () throws{ throw AwfulError.Bad }

do { try hello() print("final") } catch AwfulError.Bad { print("Bad") } catch AwfulError.Worse { print("Worse") } catch AwfulError.Terrible { print("Terrible") } catch { print("all error") }

断言 assert(assert() assert(, ) assertionFailure() assertionFailure()

typealias 这个关键字可以给类,结构,枚举等增加别名,也常常用于合并协议后的别名 typealias PetLike = protocol

编译标记 //MARK : //MARK -: // TODO: // FIXME:

Selector objc里面有@Selector(),在swift可以使用 let someMethod = Selector(“someMethodName”)得到。大多数情况无需这样

func callMe() {
    NSLog("this is callMe")
}

func callMeWithParam(timer:NSTimer) {
   NSLog("this is callMeWithParam,prarm is :\(timer.userInfo as! String)")
}

//无参数
NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector:"callMe", userInfo: nil, repeats: true)
//带参数,不使用Selector
NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector: "callMeWithParam:", userInfo: "i'm prarm", repeats: true)

扩展 extension Person{ func anotherHello(){ NSLog("another hello") } }

OptionSetType OptionSetType是NSOption在swift的替代

public struct UIViewAutoresizing : OptionSetType { public init(rawValue: UInt) public static var None: UIViewAutoresizing { get } public static var FlexibleLeftMargin: UIViewAutoresizing { get } public static var FlexibleWidth: UIViewAutoresizing { get } public static var FlexibleRightMargin: UIViewAutoresizing { get } public static var FlexibleTopMargin: UIViewAutoresizing { get } public static var FlexibleHeight: UIViewAutoresizing { get } public static var FlexibleBottomMargin: UIViewAutoresizing { get } }

//使用,选择多个 [FlexibleLeftMargin,FlexibleWidth]

(三)高级 柯里化 (Currying) 柯里化是一种量产类似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复代码

func addTwoNumbers(a: Int)(num: Int) -> Int { return a + num } let addToFour = addTwoNumbers(4) // addToFour 是一个 Int -> Int let result = addToFour(num: 6) // result = 10

封装局部变量 封装局部变量可以减少变量之间的冲突

var str:String = { //局部变量被封装 let str1 = "hello",str2 = "world" return "(str1) (str2) !" }()

方法调用的另一种方式

class Person {

//普通方法
func hi(name:String) -> String{
    return "hi \(name)"
}

//静态方法
class func hello(){
    NSLog("hello")
}

}

let person = Person()

//常规方法调用 person.hi("liuyanwei") Person.hello()

//利用方法名调用 let funcOnPerson1 = Person.hi funcOnPerson1(person)("liuyanwei")

//调用静态方法 let funcOnPerson2 = Person.hello funcOnPerson2()

swift单例标准写法

class MyManager { static private let sharedInstance = MyManager() class var sharedManager : MyManager { return sharedInstance } }

最后 ios-tips是ios开发当中常用遇到的问题和解决方法的收集,包括ios和swif。 一共包括4个部分

0_Foundation 1_UIKit 2_ThirdParty 3_Other 目前已经整理完0_Foundation,开始整理UIKit。也欢迎大家给ios-tips补充内容。

补充要求 格式是md tips都很简短,不要涉及复杂的原理和方法

收藏
0
sina weixin mail 回到顶部