网易漫画在Swift编码上积累了不少经验,新业务开发基本已过渡到Swift,以下为网易杭研文学漫画部制定的Swift编码规范,包括格式规范、命名规范、语法规范,Objective-C兼容四个部分。基于Swift release 3.0.2版本。由于目前Swift还在快速迭代中,此文档后续也会保持同步更新。
推荐
let testValue = 1 + 2
if testValue == 1 {
/* ... */
}
func testFunction(with testValue: TestClass) -> returnValue {
/* ... */
}
推荐
let testArray = [1, 2, 3, 4, 5]
不推荐
let testArray = [1,2,3,4,5]
;
推荐
print("Hello World")
不推荐
print("Hello World");
推荐
// 1. Class Define
class TestClass {
/* ... */
}
// 2. if
if testValue == 1 {
/* ... */
}
// 3. if else
if testValue == 1 {
/* ... */
} else {
/* ... */
}
// 4. while
while isTrue {
/* ... */
}
// 5. guard
guard let testValue = testValue else {
/* ... */
}
不推荐
// 1. Class Define
class TestClass
{
/* ... */
}
// 2. if
if testValue == 1
{
/* ... */
}
// 3. if else
if testValue == 1
{
/* ... */
}
else
{
/* ... */
}
// 4. while
while isTrue
{
/* ... */
}
// 5. guard
guard let testValue = testValue else
{
/* ... */
}
推荐
if testValue == 1 {
/* ... */
}
if testValue == 1 && testString == "test" {
/* ... */
}
不推荐
if (testValue == 1) {
/* ... */
}
if ((testValue == 1) && (testString == "test")) {
/* ... */
}
self.
,除非方法参数与属性同名使用self.情况
func setText(text: String) {
self.text = test
}
推荐
enum CompassPoint {
case north
case south
case east
case west
}
let directionToHead = .west
不推荐
let directionToHead = CompassPoint.west
推荐
/// <#Description#>
///
/// - Parameter testString: <#testString description#>
/// - Returns: <#return value description#>
func testFunction(testString: String?) -> String? {
/* ... */
}
不推荐
// Comment
func testFunction(testString: String?) -> String? {
/* ... */
}
//
后加空格,如果//
跟在代码后面,前面也加一个空格推荐
// 注释
let aString = "xxx" // 注释
// MARK: -
,按功能和协议/代理分组/// MARK顺序没有强制要求,但System API & Public API一般分别放在第一块和第二块。
// MARK: - Public
// MARK: - Request
// MARK: - Action
// MARK: - Private
// MARK: - xxxDelegate
推荐
@available(iOS x.0, *)
class myClass {
}
@available(iOS x.0, *)
func myFunction() {
}
推荐
HomeViewController
Bundle
不推荐
NEHomeViewController
NSBundle
推荐
let viewFrame = view.frame
不推荐
let r = view.frame
k
开头
推荐
class TestClass: class {
// UIKit的子类,后缀最好加上类型信息
let coverImageView: UIImageView
@IBOutlet weak var usernameTextField: UITextField!
// 作为属性名的firstName,明显是字符串类型,所以不用在命名里不用包含String
let firstName: String
// UIViewContrller以ViewController结尾
let fromViewController: UIViewController
}
不推荐
class TestClass: class {
// image不是UIImageView类型
let coverImage: UIImageView
// or cover不能表明其是UIImageView类型
var cover: UIImageView
// String后缀多余
let firstNameString: String
// UIViewContrller不要缩写
let fromVC: UIViewController
}
参数标签规则(from Swift API Design Guidelines)
2.6.1 省略所有的冗余的参数标签
推荐
func min(_ number1: int, _ number2: int) {
/* ... */
}
min(1, 2)
推荐
extension UInt32 {
/// 安全值类型转换,16位转32位,可省略参数标签
init(_ value: Int16)
/// 非安全类型转换,64位转32位,不可省略参数标签
/// 截断显示
init(truncating source: UInt64)
/// 非安全类型转换,64位转32位,不可省略参数标签
/// 显示最接近的近似值
init(saturating valueToApproximate: UInt64)
}
推荐
// 添加介词标签havingLength
func removeBoxes(havingLength length: int) {
/* ... */
}
x.removeBoxes(havingLength: 12)
例外情况是,当后面所有参数构成独立短语时,则介词提前。
推荐
// 介词To提前
a.moveTo(x: b, y: c)
// 介词From提前
a.fadeFrom(red: b, green: c, blue: d)
不推荐
a.move(toX: b, y: c)
a.fade(fromRed: b, green: c, blue: d)
推荐
// 参数构成语句一部分,省略第一个参数标签
x.addSubview(y)
// 参数不构成语句一部分,不省略第一个参数标签
view.dismiss(animated: false)
推荐
func remove(_ member: Element) -> Element?
不推荐
func removeElement(_ member: Element) -> Element?
推荐
let urlRouterString = "https://xxxxx"
let htmlString = "xxxx"
class HTMLModel {
/* ... */
}
struct URLRouter {
/* ... */
}
不推荐
let uRLRouterString = "https://xxxxx"
let hTMLString = "xxxx"
class HtmlModel {
/* ... */
}
struct UrlRouter {
/* ... */
}
推荐
var isString: Bool = true
推荐
public enum UITableViewRowAnimation : Int {
case fade
case right // slide in from right (or out to right)
case left
case top
case bottom
case none // available in iOS 3.0
case middle // available in iOS 3.2. attempts to keep cell centered in the space it will/did occupy
case automatic // available in iOS 5.0. chooses an appropriate animation style for you
}
协议规则(from Swift API Design Guidelines)
推荐
protocol TableViewSectionProvider {
func rowHeight(at row: Int) -> CGFloat
var numberOfRows: Int { get }
/* ... */
}
able
或 ing (eg. Equatable、 ProgressReporting)推荐
protocol Loggable {
func logCurrentState()
/* ... */
}
protocol Equatable {
func ==(lhs: Self, rhs: Self) -> bool {
/* ... */
}
}
Protocol
后缀推荐
protocol InputTextViewProtocol {
func sendTrackingEvent()
func inputText() -> String
/* ... */
}
相关阅读:【Swift编码规范】(下篇)
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者胡波授权发布。