这里每天分享一个 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

其他的控件比方 NSViewUIView,也是一样的道理。

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新知”,每天按时分享一个新知识,这里仅仅同步,想要及时学到就来关注我吧!