内容
一般信息
内容是一个代码片段集合,这些片段太小,不足以创建库,且不适合放置在其他库中。运行单元测试以查看代码的实际运行情况。
打印
您可以通过在Podfile中添加以下行来安装它:
pod "Stuff/Print"
Stuff.print函数旨在替代标准的.print函数。它会提供关于打印机何时以及在哪里执行的信息。除此之外,还支持不同的日志级别,您还可以指定应该输出的最低日志级别。
以下是一些示例
Stuff.print("Just as the standard print but now with detailed information")
Stuff.print("Now it's a warning", .warn)
Stuff.print("Or even an error", .error)
Stuff.minimumLogLevel = .error
Stuff.print("Now you won't see normal log output")
Stuff.print("Only errors are shown", .error)
Stuff.minimumLogLevel = .none
Stuff.print("Or if it's disabled you won't see any log", .error)
以上代码的输出是
✳️ .debug ⏱ 02/13/2017 09:52:51:852 📱 xctest [18960:?] 📂 PrintStuffTests.swift(15) ⚙️ testExample() ➡️
Just as the standard print but now with detailed information
⚠️ .warn ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(16) ⚙️ testExample() ➡️
Now it's a warning
🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(17) ⚙️ testExample() ➡️
Or even an error
🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(21) ⚙️ testExample() ➡️
Only errors are shown
还有一个用于错误对象的快速打印语句。这会将本地化描述打印出来,并将警告级别设置到.error。
Stuff.print(error)
更新:从现在开始打印.error也会给你一个堆栈跟踪。
更新时间:2019年4月4日:现在您也可以将minimumLogLevel设置为productionLogAll。这将确保您也可以在控制台(菜单“窗口”,“设备和模拟器”,“打开控制台”)中看到日志。在大多数情况下,您只有在想要查看使用Testflight分发的应用的日志时才应使用此设置。
枚举
您可以通过在Podfile中添加以下行来安装它:
pod "Stuff/Enum"
- 获取数组中所有可能的枚举值
- 获取任何枚举的关联值
- 将包含关联值的枚举数组转换为字典或查询字符串。
- 即使枚举是通过any传递的,也能获取枚举的原始值
// You have to extend the enum with the Enum protocol (and RawEnum if you want the raw value when it's an Any)
enum test1: String, Enum, RawEnum {
case option1
case option2
case option3
}
enum test2: Enum {
case option4(String)
case option5(Int)
case option6(Int, String)
}
XCTAssert(test1.allValues.count == 3, "There should be 3 values")
for value in test1.allValues {
print("value = \(value)")
}
let v1: test2 = .option4("test")
print("v1 = \(v1.associated.label), \(v1.associated.value!)")
let v2: test2 = .option5(3)
print("v2 = \(v2.associated.label), \(v2.associated.value!)")
let v3: test2 = .option6(4, "more")
print("v3 = \(v3.associated.label), \(v3.associated.value!)")
let array = [v1, v2, v3]
let dict = [String:Any](array)
print("Array of enums as dictionary:\n \(dict)")
print("query = \(array.queryString))")
let v = getRawValue(test1.option2)
print("raw value = \(v)")
func getRawValue(_ value: Any) -> Any {
return (value as? RawEnum)?.anyRawValue ?? ""
}
输出如下
value = option1
value = option2
value = option3
v1 = option4, test
v2 = option5, 3
v3 = option6, (4, "more")
Array of enums as dictionary:
["option5": 3, "option4": "test", "option6": (4, "more")]
query = option4=test,option5=3,option6=(4, "more"))
raw value = option2
待办事项
您可以通过在Podfile中添加以下行来安装它:
pod "Stuff/TODO"
每当您将函数添加到项目中并推迟实现时,您应该添加待办事项。每当您临时更改功能代码进行调试时,您应该添加待办事项。在提交/推送代码之前,您应该评估/解决待办事项。通常,您只需在代码中添加如下待办事项注释即可
//TODO: This needs to be fixed
使用Stuff/TODO助手,您可以获得编译时和运行时支持,以帮助您找到待办事项。以下是您可以使用的选项概览
// We need to fix something, but this code can run (compiler warning)
TODO()
// Now output extra info when this code is executed.
TODO("An other todo, now giving some detailed info")
// We need to fix this. Otherwise just fail. The code will crash here. See the stacktrace,
TODO_
上面的代码将以下内容放入您的输出。除了这些以外,当您在Xcode中打开代码时,您还将看到已弃用警告。
⚠️ TODO code is still in use! ⚠️
⚠️ TODO code is still in use! ⚠️
An other todo, now giving some detailed info
fatal error: TODO left in code: file /Users/evermeer/Desktop/dev/GitHub/Stuff/Source/TODO/TODO.swift, line 15
但是...添加以下构建阶段脚本可能更好一些,这将提供编译时警告
KEYWORDS="TODO|FIXME|\?\?\?:|\!\!\!:"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | \
perl -p -e "s/($KEYWORDS)/ warning: \$1/"
Codable
您可以通过在Podfile中添加以下行来安装它:
pod "Stuff/Codable"
Swift 4添加了Codable协议(EnCodable和DeCodable),您可以将其添加到类或结构体中。然后Swift编译器将为您的对象添加编码和解码功能。通过使用JSONEncoder和JSONDecoder类,您可以将对象从JSON转换为JSON,或将JSON转换为对象。Stuff Codable扩展可以让您一行代码完成这些操作。以下是从Apple获取的关于《Codable》的文档:Codable。以下是一行代码可用的选项
let json = yourEncodableObjectInstance.toJsonString()
let data = yourEncodableObjectInstance.toJsonData()
let newObject = try? YourCodableObject(json: json)
let newObject2 = try? YourCodableObject(data: data)
let objectArray = try? [YourCodableObject](json: json)
let objectArray2 = try? [YourCodableObject](data: data)
let newJson = objectArray.toJsonString()
let innerObject = try? TestCodable(json: "{\"user\":{\"id\":1,\"naam\":\"Edwin\"}}", keyPath: "user")
try initialObject.saveToDocuments("myFile.dat")
let readObject = try? TestCodable(fileNameInDocuments: "myFile.dat")
try objectArray.saveToDocuments("myFile2.dat")
let objectArray3 = try? [TestCodable](fileNameInDocuments: "myFile2.dat")
下面你可以看到如何使用这些Stuff/Codable函数
func test() {
let initialObject = TestCodable(naam: "Edwin", id: 1, testField: "tst")
guard let json = initialObject.toJsonString() else {
print("Could not create json from object")
return
}
print("Json string of object = \n\t\(json)")
guard let newObject = try? TestCodable(json: json) else {
print("Could not create object from json")
return
}
print("Object created with json = \n\t\(newObject)")
let json2 = "[{\"id\":1,\"naam\":\"Edwin\"},{\"id\":2,\"naam\":\"Vermeer\"}]"
guard let array = try? [TestCodable](jsonArray: json2) else {
print("Could not create object array from json")
return
}
print("Object array created with json = \(array)")
let newJson = array.toJsonString()
print("Json from object array = \n\t\(newJson)")
guard let innerObject = try? TestCodable(json: "{\"user\":{\"id\":1,\"naam\":\"Edwin\"}}", keyPath: "user") else {
print("Could not create object from json")
return
}
print("inner object from json \(String(describing: innerObject))")
guard let custom = try TestCodable(json: "{\"Naam\":\"UpperN\", \"Id\":5, \"Test_field\":\"lowerSnake\"}", keyPath: nil, codingStrategy: customCodingStragegy) else {
print("Could not custom case convert")
return
}
print("read object with custom key coding from json to \(String(describing:
}
struct TestCodable : Codable {
var naam: String?
var id: Int?
var testField: String?
}
除了上面的示例代码中显示的keyPath参数之外,您还可以添加一个或多个标准JSONDecoder中的以下参数。如果未提供这些参数,则将使用默认值(=后面的值)。
keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .convertFromSnakeCase,
dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .deferredToDate,
dataDecodingStrategy: JSONDecoder.DataDecodingStrategy = .base64,
nonConformingFloatDecodingStrategy: JSONDecoder.NonConformingFloatDecodingStrategy = .throw
许可证
内容受MIT 3许可证许可。更多详细信息请参阅LICENSE文件。
我的其他库
另请参阅我的其他公开源iOS库
- EVReflection - 基于反射的对象映射(字典、CKRecord、JSON和XML)与对于Alamofire和Moya的扩展,支持RxSwift或ReactiveSwift
- EVCloudKitDao - 简化访问苹果的CloudKit
- EVFaceTracker - 计算您的设备相对于您脸部的距离和角度,以模拟3D效果
- EVURLCache - 处理使用NSURLRequest的所有Web请求的NSURLCache子类
- AlamofireOauth2 - 使用Alamofire实现的OAuth2
- EVWordPressAPI - 使用AlamofireOauth2、EVReflection和Alamofire实现的WordPress(Jetpack)API(进行中)
- PassportScanner - 扫描护照的MRZ代码并提取名、姓、护照号码、国籍、出生日期、过期日期和个人编号。
- AttributedTextView - 创建具有多个链接(URL、井号、提及)支持的格式化UITextView的最简单方式
- UITestHelper - UI测试辅助函数。