我想在我自己的swift项目中找到未编译源代码的目录(因为我想计算它的行数)。
let projectRepo = "/Users/tombrown/Workspace/SwiftGolf" // <-- I want this programmatically
let path = "\(projectRepo)/SwiftGolf/Golf.swift"
var fileContents = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)
我找到了NSBundle.mainBundle().bundlePath
的编译位置,但它不包含未编译的代码。有什么想法吗?也许有一种方法可以在构建过程中编写临时文件?
答案 0 :(得分:2)
挑战是在运行时与编译时间之间快速推断位置。 xcode建议中的参数运行良好,可以作为解决方案接受。我无法使用这种方法,因为我在没有xcode的情况下使用SPM。另一种方法可能是使用此库https://github.com/JohnSundell/Files
你在Package.swift中的
dependencies: [
.Package(url: "https://github.com/JohnSundell/Files.git", Version(1,8,0))
]
然后在你的代码中
import Files
let projectRepo = "\(Folder.home.path)/gitWorkspace/SwiftGolf"
do {
let model = try Data(contentsOf:URL(fileURLWithPath: "\(projectDir)/\(modelFile)"))
}catch {
print("error: \(error)")
}
另一个选项是CommandLineKit / xcode参数
import CommandLineKit .
let cmdLine = CommandLineKit.CommandLine() .
let file = StringOption(shortFlag: "f",
longFlag: "file",
required: true,
helpMessage: "The file you're trying to parse") .
cmdLine.addOptions(file)
do {
try cmdLine.parse()
print(file.value!)
} catch {
print("error: \(error)")
exit(-1)
}
答案 1 :(得分:1)
由于将源文件添加到Build Phases > Copy Bundle Resources
并不起作用并且具有更大的灵活性,我建议使用一点点Objective-C。
在项目Build Settings
中添加以下内容:
然后如果你的项目已经有一个桥接头,那么const将从Swift自动获得
do {
let path = "\(PROJECT_DIR)/Test/ViewController.swift"
let source = try String(contentsOfFile: path)
print(source)
} catch {
print("Error handling goes here")
}
如果项目没有桥接标题,则可以通过向项目添加新的Objective-C类来使Xcode添加一个,然后Xcode会询问桥接标题。 / p>
编辑:
当然,也可以通过向项目添加新的头文件,然后将其路径设置为&#34; Objective-C Bridging Header&#34;来手动添加桥接头。在项目的构建设置中。
通常PROJECT_DIR宏不会自动提供给Swift代码,在桥接头中添加:
@import Foundation;
static const NSString *kProjectDir = PROJECT_DIR;
结束编辑
如果您对文件的只读访问权限很好,您可以通过添加自定义脚本或Copy Files
构建阶段来使Xcode将源文件复制到应用程序的资源文件夹中:
然后文件的路径为:
let path = NSBundle.mainBundle().pathForResource("ViewController", ofType: "swift")