这里每天分享一个 iOS 的新知识,快来关注我吧
前言
Typealias 是 Swift 中的一种特性,它允许给现有类型界说一个新的别号。用 Typealias 命名的类型不是一个新类型,它仅仅特定类型的语义笼统。
这个功用能够使咱们的代码更具可读性,更易于维护。今天来讲讲这个关键字的一些运用场景。
1. 更好的语义
能够运用 typealias
来让一个类型具有语义,使代码更有可读性,一个十分典型的比方就是 TimeInterval
类型,很多人或许还不知道,其实 TimeInterval
并不是一个新的类型,而是 Double
类型的别号,咱们点开 TimeInterval
的声明文件就能够看到了:
publictypealiasTimeInterval=Double
用 TimeInterval
作为 Double
的别号,就让 Double 类型有了时刻距离语义。
再举个比方,Kingfisher 中有个场景是把 Int 类型命名为了 CancelToken,用来记录撤销使命的 token,这种做法的目的也是让类型具有语义。
publictypealiasCancelToken=Int
2. 降低代码复杂度,进步可读性
能够运用 typealias
来为闭包类型、函数类型等界说别号,使代码更易于了解和维护。
比方有些闭包类型比较长,每次写很不方便,就能够把它界说一个别号,比方。
typealiasCompletionHandler=(_success:Bool)->String
funcdoSomething(completion:CompletionHandler){
//履行一些操作
completion(true)
}
doSomething{successin
ifsuccess{
return"操作成功"
}else{
return"操作失利"
}
}
还有一些嵌套类型的状况,导致外界拜访时类型名十分长,这时候也能够用 typealias
解决,比方下边这个比方:
structMyStruct{
structNestedStruct{
structSuperNestedStruct{
typealiasNestedType=Int
}
}
}
letvalue:MyStruct.NestedStruct.SuperNestedStruct.NestedType=5
print(value)//输出"5"
typealiasMyType=MyStruct.NestedStruct.SuperNestedStruct.NestedType
letnewValue:MyType=10
print(newValue)//输出"10"
3. 跨渠道开发
运用 typealias
能够在不同渠道之间提供不同的实现,从而简化跨渠道开发的代码。
比方你要开发一个框架,既支持 iOS 又支持 macOS,那么渠道的差异会导致类型不同,比方颜色的类型,在 iOS 中为 UIColor
,在macOS 中为 NSColor
,这时候为了简化开发流程就能够运用来简化。
#ifos(macOS)
typealiasColor=NSColor
#elseifos(iOS)||os(tvOS)||os(watchOS)
typealiasColor=UIColor
#endif
lettextColor:Color=.red
其他的控件比方 NSView
、UIView
,也是一样的道理。
4. 泛型类型的简化
当运用泛型类型时,能够运用 typealias
来为泛型类型界说一个更具表达力的别号,这种用法其实和第一种相似,也是进步了原类型的语义。
typealiasKeyValue=Dictionary<String,Any>
funcprocessDictionary(dict:KeyValue){
//处理字典
}
letdict:KeyValue=["name":"John","age":30]
processDictionary(dict:dict)
5. 简化元组
元组中假如数量过多,也会导致类型十分长,这时候除了削减元素数量之外,也能够运用 typealias
为复杂元组类型界说一个更有意义的别号,从而进步代码的可读性。
以Alamofire 为例,在做身份验证时有一段运用 typealias
为元组类型界说别号的场景:
typealiasChallengeEvaluation=(disposition:URLSession.AuthChallengeDisposition,credential:URLCredential?,error:AFError?)
openfuncurlSession(_session:URLSession,
task:URLSessionTask,
didReceivechallenge:URLAuthenticationChallenge,
completionHandler:@escaping(URLSession.AuthChallengeDisposition,URLCredential?)->Void){
eventMonitor?.urlSession(session,task:task,didReceive:challenge)
letevaluation:ChallengeEvaluation
switchchallenge.protectionSpace.authenticationMethod{
caseNSURLAuthenticationMethodHTTPBasic,NSURLAuthenticationMethodHTTPDigest,NSURLAuthenticationMethodNTLM,
NSURLAuthenticationMethodNegotiate:
evaluation=attemptCredentialAuthentication(for:challenge,belongingTo:task)
#if!(os(Linux)||os(Windows))
caseNSURLAuthenticationMethodServerTrust:
evaluation=attemptServerTrustAuthentication(with:challenge)
caseNSURLAuthenticationMethodClientCertificate:
evaluation=attemptCredentialAuthentication(for:challenge,belongingTo:task)
#endif
default:
evaluation=(.performDefaultHandling,nil,nil)
}
ifleterror=evaluation.error{
stateProvider?.request(for:task)?.didFailTask(task,earlyWithError:error)
}
completionHandler(evaluation.disposition,evaluation.credential)
}
它将一个元组类型 (disposition: URLSession.AuthChallengeDisposition, credential: URLCredential?, error: AFError?)
界说为 ChallengeEvaluation
,以进步这个类型的可读性和可维护性。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 “iOS新知”,每天按时分享一个新知识,这里仅仅同步,想要及时学到就来关注我吧!