рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░
Swift.assert()
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдпрджрд┐ рдпрд╣ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ - рдпрд╣ рдмреБрд░рд╛ рдХреНрдпреЛрдВ рд╣реИ?)ред рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдЖрдк рдЕрдХреНрд╕рд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдХреЙрд▓:
Swift.assert(Thread.isMainThread)
рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЗрди рдХреЙрд▓реНрд╕ рд╕реЗ рдирддреАрдЬреЛрдВ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рди рдХреЗрд╡рд▓ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ / рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рднреАрддрд░, рдмрд▓реНрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рднреАред рд╡реИрд╕реЗ, рдпрд╣рд╛рдВ рд╣рдо
Swift.precondition()
,
Swift.fatalError()
, рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрдирд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ
рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝рд╛ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд┐рдХрд▓рд╛ред
рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдХрд░реАрдм:
рдХреЛрдб рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрднрдЧ 300 рдРрд╕реЗ рдХреЙрд▓ рдорд┐рд▓реЗред рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕рдиреЗ рдореБрдЭреЗ рдкреНрд░рд╕рдиреНрди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЕрднреА рднреА рдХреБрдЫ рдХреЙрд▓ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреА рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдлрд┐рд░ рд╕реЗ, рдореЗрд░реА рд░рд╛рдп)ред рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдп рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдкрд╡рд╛рдж рд╣рдореЗрд╢рд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рд░реВрдк рдореЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реИрдХрдбрд╝реЛрдВ рдЯреЗрдмрд▓ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╕ рдЕрджреГрд╢реНрдп рдереАред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд▓реЙрдЧ рдХреА рдбрд┐рд▓реАрд╡рд░реА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд╣рд░ рд▓реЙрдЧ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рджреВрд╕рд░реЗ, рдШрдЯрдирд╛ рдХреЗ рджреГрд╢реНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЕрдиреНрдпрдерд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рддреАрд╕рд░рд╛, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрд╢реЛрдзрд┐рдд рдкрд░реАрдХреНрд╖рдг рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ
Thread.isMainThread
рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП
RxTest рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛
рд╣реВрдВ (рдпрд╣рд╛рдВ рдореИрдВ рд╕рд▓рд╛рд╣ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рднреА рддреИрдпрд╛рд░ рд╣реВрдВ)ред рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд░рд╣рд╛ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред
Loggin.assert()
рдХреЛ рдЙрд╕реА рд╕рдордп рдлрд╛рдпрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм
Swift.assert()
рдлрд╛рдпрд░ рдХрд░реЗрдЧрд╛
рдлреИрдмреНрд░рд┐рдХ (
рдХреНрд░реИрд╢рд▓рд╛рдИрдЯрд┐рдХреНрд╕ ) рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
Crashlytics.sharedInstance().recordCustomExceptionName("", reason: ""...
рдпрд╣
рдХреНрд░реИрд╢рд▓рд╛рдИрдЯрд┐рдХреНрд╕ рдХреЛ рдХреБрдЫ рдврд╛рдВрдЪреЗ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕рдХреА
рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ
рдХреНрд░реВрд╕рд┐рдПрдЯреЗрдб (рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛) рдореЗрдВ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ
рдХреЛрдХреЛрдкреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "
рдкреИрдХреЗрдЬрд┐рдВрдЧ " рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
Pod::Spec.new do |s| s.name = 'Logging' ... s.subspec 'Base' do |ss| ss.source_files = 'Source/Logging+Base.swift' ss.dependency 'Crashlytics' end s.subspec 'Test' do |ss| ss.source_files = 'Source/Logging+Test.swift' end end
"рдореБрдХрд╛рдмрд▓рд╛ рд▓рдХреНрд╖реНрдп" рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
import Crashlytics public enum Logging { public static func send(_ reason: String? = nil, __file: String = #file, __line: Int = #line) { let file = __file.components(separatedBy: "/").last ?? __file let line = "\(__line)" let name = [line, file].joined(separator: "_") Crashlytics.sharedInstance().recordCustomExceptionName(name, reason: reason ?? "no reason", frameArray: []) } public static func assert(_ assertion: @escaping @autoclosure () -> Bool, reason: String? = nil, __file: String = #file, __line: Int = #line) { if assertion() == false { self.assertionFailure(reason, __file: __file, __line: __line) } } public static func assert(_ assertion: @escaping () -> Bool, reason: String? = nil, __file: String = #file, __line: Int = #line) { if assertion() == false { self.assertionFailure(reason, __file: __file, __line: __line) } } public static func assertionFailure(_ reason: String? = nil, __file: String = #file, __line: Int = #line) { Swift.assertionFailure(reason ?? "") self.send(reason, __file: __file, __line: __line) } }
"рдкрд░реАрдХреНрд╖рдг рд▓рдХреНрд╖реНрдп" рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛
Crashlytics рдирд┐рд░реНрднрд░рддрд╛:
import Foundation public enum Logging { public static func send(_ reason: String? = nil, __file: String = #file, __line: Int = #line) {
рдкрд░рд┐рдгрд╛рдо:
рдЕрдкрд╡рд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд▓рдд рдкреНрд░рд╛рд░реВрдк рдХреА рд╕реВрдЪрдирд╛ рджреА:
Decodable
рдХрднреА-рдХрднреА
Decodable
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдХрднреА-рдХрднреА
Thread.isMainThread
рд▓рд┐рдП рд▓реЙрдЧ рдХрд╛рдо рдХрд░рддреЗ рдереЗ, рдЬреЛ рдЕрдЧрд▓реЗ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА рддрдп рд╣реЛ рдЧрдП рдереЗред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЪрдорддреНрдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ
NSException рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛
рдерд╛ ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
PS рдпрджрд┐ рдЖрдк рднреА рдЕрдХреНрд╕рд░ рдРрд╕реЗ рд▓реЙрдЧ рдХреЛ
рдХреНрд░реИрд╢рд▓рд╛рдИрдЯрд┐рдХреНрд╕ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рд╕реЗрд╡рд╛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдкреИрдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рди рд╕рдХрддреА рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдЕрдиреБрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг, рдЧреИрд░-рдШрд╛рддрдХ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдХрдИ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдиреЗрдВред
рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЙрдЧ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╕рднреА рдмрд┐рд▓реНрдб рд▓реЙрдЧ рдХреЛ
рдХреНрд░реИрд╢рд▓рд╛рдИрдЯрд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
ред