Swift中函数声明与定义的分离

Swift中函数声明与定义的分离,swift,encapsulation,Swift,Encapsulation,我正在看新的雨燕。我来自C,C++,Objtovi-C。我注意到,在swift中,不可能(?)将函数的声明和定义分开。这样做的结果是结构和类声明非常长且臃肿,因此很难通过查看代码来“快速了解”类。我做错什么了吗?除了设法使函数变小等,还有什么方法可以克服这个问题吗。?提前感谢swift中的,声明与实施之间没有分离。这与大多数其他现代语言(如Python)一样有效。如果你想快速了解你的班级,你应该使用代码折叠。只需折叠所有方法和函数。并展开您想要修改/处理的方法。Swift不允许您将声明与实现分开

我正在看新的雨燕。我来自C,C++,Objtovi-C。我注意到,在swift中,不可能(?)将函数的声明和定义分开。这样做的结果是结构和类声明非常长且臃肿,因此很难通过查看代码来“快速了解”类。我做错什么了吗?除了设法使函数变小等,还有什么方法可以克服这个问题吗。?提前感谢swift中的

,声明与实施之间没有分离。这与大多数其他现代语言(如Python)一样有效。如果你想快速了解你的班级,你应该使用代码折叠。只需折叠所有方法和函数。并展开您想要修改/处理的方法。

Swift不允许您将声明与实现分开。这是双向的——一方面,您不能(手动)编写头文件来描述要向代码用户公开的接口。另一方面,您不必手动使头文件保持最新并与实现同步


相反,Swift有一个机制。使用
public
internal
(隐含)和
private
关键字来标记您打算公开哪些类型和函数。

这是一种让公共API和私有实现都很疯狂的方法:

疯狂-代表工厂方法
create()
,我不喜欢在没有实际需要的情况下在swift中看到它

AClass.swift文件中:

// Public API
class AClass {

    private init() {

    }

    class func create() -> AClass {
        return AClassPrivateImplementation()
    }

    // Only method declaration
    func sayHello() {}
}

// Private implementation
private class AClassPrivateImplementation: AClass {

    override func sayHello() {
        privateImplementation()
    }

    func privateImplementation() {
        println("Hello")
    }
}
用法:

let a = AClass.create()
a.sayHello()
工作原理:
private
修改器使内容仅在源文件中可见

优点:您可以定义多个实现,因此需要额外的
createOther()


缺点:它看起来像Java或C#,不是一种快速的方法:)

我们能做的最好的方法是使用协议作为实现声明并标记所有私有方法:

protocol TestInterface {
    var propertyPublic1: String { get }
    func funcPublic1() -> Int
}

class Test : TestInterface {
    var propertyPublic1: String = "text."
    func funcPublic1() -> Int {return 754}

    private var propertyPrivate1: Int = 5678
    private func funcPrivate1() -> Int {return 334}
}

var t = Test()
let propPublic1 = t.propertyPublic1

问题是它不是作为标准的惯用语提供的,而且命名很不幸,我只是在类名后面附加了“接口”。

是的,swift确实没有头文件,但您可以让Xcode生成类似的东西

这将为您提供您所提到的课程的概述

在Xcode上转到
导航>跳转到生成的界面


这应该解释得更清楚一点。

嗯。。。是 啊嗯,也许随着时间的推移我会习惯的。那我们就尽量灵活些吧。谢天谢地,我怀疑代码的某些“表现”方面留给了编辑器(?)。你谈论折叠(哪种有帮助)。这个问题类似于语句末尾不需要分号的事实。到目前为止,语句不再允许跨越行,因此对于长行,我们将不得不依赖编辑器的“软包装”(?)——没错,Swift不像Objective-C那样冗长(谢天谢地!)这并不完全正确,因为您有Cocoa API和Swift标准库的“声明”,但没有它们的实现。您不能用自己的Swift代码来实现这一点。@newact Apple将框架/库的接口提供给您。我相信这并没有告诉你这个框架/库的源代码是什么样子的?当然,我可以将方法标记为private,但是在不阅读代码的情况下,没有声明哪些方法是接口。最后,Objective-C提供了创建小型接口的功能,只公开方法。“您不能(手动)编写描述要公开的接口的头文件”好的,那么您可以不手动执行吗?不管怎样,苹果是这样做的(他们描述了他们想要向你展示的界面,但没有给你实现)。@newacct实际上,如果不能手动完成,对我的意图没有帮助。我想分别编写接口/声明的实现/定义;这是一个工作流问题。只能将界面发送给用户并不意味着我可以单独编写界面。不,你没有做错任何事情。他们抛出了“向接口写入”的概念。我想这个概念是,对于程序员来说,一切都是可见的,所以从理论上讲,没有真正的需要有一个单独的接口。在实践中,我看到的问题是很难跟踪事物的结构。。。时间会说(?),但现在,是的,语言的这方面感觉有点混乱。另一个问题是,我没有在接口中公开的方法是实现细节,我可以随意更改、添加和删除,而不必担心有其他用法可能破坏程序。从坚实的原则中去掉“我”。现在,请快速告诉Michael Feathers.:-)是的,很疯狂。。。看起来不太好是的。。。但是每个类都需要它的协议,这有点混乱(从设计角度来看可能是错误的)。此外,在最后,函数的定义仍然必须与声明一起编写,无论如何……协议可以在一个单独的文件中。