天道酬勤,学无止境

如何在快速的操场上读取文件(How can I read a file in a swift playground)

问题

我正在尝试使用以下内容使用Swift操场读取文本文件

let dirs : String[]? =    NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as? String[]

if (dirs != nil) {
    let directories:String[] = dirs!;
    let dir = directories[0]; //documents directory
    let path = dir.stringByAppendingPathComponent(file);

    //read
    let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)
}

但是,这将失败且没有错误。 似乎第一行阻止了Playground在下面输出任何内容

回答1

这对我有用。 我唯一更改的是明确显示文件名(在您的示例中是隐含的)-也许您在“文件”变量的屏幕外定义中有错字?

let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as? [String]

let file = "trial.txt" // My change to your code - yours is presumably set off-screen
if let directories = dirs {
  let dir = directories[0]; //documents directory
  let path = dir.stringByAppendingPathComponent(file);

  //read
  let content = NSString(contentsOfFile: path, usedEncoding: nil, error: nil)
  // works...
}

更新Swift 4.2

正如@raistlin指出的那样,现在

let dirs = NSSearchPathForDirectoriesInDomains(
              FileManager.SearchPathDirectory.documentDirectory,
              FileManager.SearchPathDomainMask.userDomainMask,
              true)

或者,更简洁地说:

let dirs = NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                .userDomainMask, true)
回答2

您还可以将文件放入游乐场的资源中。 为此:显示带有CMD + 1 Project Navigator。 将文件拖放到资源文件夹中。 然后读取文件:

在XCode 6.4和Swift 1.2上:

var error: NSError?
let fileURL = NSBundle.mainBundle().URLForResource("Input", withExtension: "txt")
let content = String(contentsOfURL: fileURL!, encoding: NSUTF8StringEncoding, error: &error)

在XCode 7和Swift 2上:

let fileURL = NSBundle.mainBundle().URLForResource("Input", withExtension: "txt")
let content = try String(contentsOfURL: fileURL!, encoding: NSUTF8StringEncoding)

在XCode 8和Swift 3上:

let fileURL = Bundle.main.url(forResource: "Input", withExtension: "txt")
let content = try String(contentsOf: fileURL!, encoding: String.Encoding.utf8)

如果文件包含二进制数据,则可以使用NSData(contentsOfURL: fileURL!)Data(contentsOf: fileURL!) (对于Swift 3)。

回答3

虽然提供了快速解决方案的答案,但是有更好的解决方案。

每次打开游乐场时,都会为其分配一个新的容器。 这意味着使用普通目录结构,您每次必须将所需文件复制到新容器中。

相反,在容器内有一个指向“共享游乐场数据”目录的符号链接(/ Users / UserName / Documents / Shared Playground Data),该目录在重新打开游乐场时仍然存在,并且可以从多个游乐场进行访问。

您可以使用XCPlayground访问此共享文件夹。

import XCPlayground

let path = XCPlaygroundSharedDataDirectoryURL.appendingPathComponent("foo.txt")

官方文档可以在这里找到:XCPlayground模块参考

关于如何按操场组织此目录的精彩文章:Swift,Playgrounds和XCPlayground


更新:对于Swift 4.2,请使用PlaygroundSharedDataDirectory。 不需要导入任何东西。 好像:

let path = playgroundSharedDataDirectory.appendingPathComponent("file")
回答4

1.访问位于Playground的Resources文件夹中的文件

在Swift 3中, Bundle有一个称为url(forResource:withExtension :)的方法。 url(forResource:withExtension:)具有以下声明:

func url(forResource name: String?, withExtension ext: String?) -> URL?

返回由指定名称和文件扩展名标识的资源的文件URL。

您可以使用url(forResource:withExtension:)来读取位于iOS或Mac Playground的Resources文件夹中的json文件的内容:

import Foundation

do {
    guard let fileUrl = Bundle.main.url(forResource: "Data", withExtension: "json") else { fatalError() }
    let data = try Data(contentsOf: fileUrl)
    let json = try JSONSerialization.jsonObject(with: data, options: [])
    print(json)
} catch {
    print(error)
}    

您可以使用url(forResource:withExtension:)来读取位于iOS或Mac Playground的Resources文件夹中的文本文件的内容:

import Foundation

do {
    guard let fileUrl = Bundle.main.url(forResource: "Text", withExtension: "txt") else { fatalError() }
    let text = try String(contentsOf: fileUrl, encoding: String.Encoding.utf8)
    print(text)
} catch {
    print(error)
}

作为let image = UIImage(named: "image")的替代方法,可以使用url(forResource:withExtension:)来访问位于iOS Playground的Resources文件夹中的图像:

import UIKit

do {
    guard let fileUrl = Bundle.main.url(forResource: "Image", withExtension: "png") else { fatalError() }
    let data = try Data(contentsOf: fileUrl)
    let image = UIImage(data: data)
} catch {
    print(error)
}

2.访问位于计算机的~/Documents/Shared Playground Data文件夹中的文件

在Swift 3中, PlaygroundSupport模块提供了一个名为PlaygroundSupport的全局常量。 playgroundSharedDataDirectory具有以下声明:

let playgroundSharedDataDirectory: URL

目录的路径,其中包含所有游乐场之间共享的数据。

您可以使用playgroundSharedDataDirectory以便读取坐落在一个JSON文件的内容~/Documents/Shared Playground Data您的计算机从iOS或Mac游乐场的文件夹:

import Foundation
import PlaygroundSupport

do {
    let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("Data.json")        
    let data = try Data(contentsOf: fileUrl)
    let json = try JSONSerialization.jsonObject(with: data, options: [])
    print(json)
} catch {
    print(error)
}

您可以使用playgroundSharedDataDirectory以便读取坐落在一个文本文件的内容~/Documents/Shared Playground Data您的计算机从iOS或Mac游乐场的文件夹:

import Foundation
import PlaygroundSupport

do {
    let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("Text.txt")
    let text = try String(contentsOf: fileUrl, encoding: String.Encoding.utf8)
    print(text)
} catch {
    print(error)
}

您可以使用playgroundSharedDataDirectory以访问位于图像~/Documents/Shared Playground Data您的计算机从iOS游乐场的文件夹:

import UIKit
import PlaygroundSupport

do {
    let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("Image.png")
    let data = try Data(contentsOf: fileUrl)
    let image = UIImage(data: data)
} catch {
    print(error)
}
回答5

斯威夫特3(Xcode 8)

以下代码可在iOS和macOS游乐场中使用。 文本文件(在此示例中为“ MyText.txt”)必须位于游乐场的Resources目录中。 (注意:您可能需要打开导航器窗口以查看游乐场的目录结构。)

import Foundation

if let fileURL = Bundle.main.url(forResource:"MyText", withExtension: "txt")
{
    do {
        let contents = try String(contentsOf: fileURL, encoding: String.Encoding.utf8)
        print(contents)
    } catch {
        print("Error: \(error.localizedDescription)")
    }
} else {
    print("No such file URL.")
}
回答6
  1. 选择.playground文件。

  2. 打开工具检查器,在操场上按opt-cmd-1打开文件检查器。 您应该会在右边看到游乐场。 如果尚未选择,请按cmd-1打开“项目导航器”,然后单击“游乐场”文件。

  3. 在“游乐场设置”的“资源路径”下,选择“相对游乐场”,并将平台作为OSX。

回答7

在带有Xcode 6.0.1 Mavericks上,您也可以使用iOS平台进行阅读。

import UIKit
let dirs : [String]? =    NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as? [String]
let myDir = "/Shared Playground Data"

let file = "README.md" // My change to your code - yours is presumably set off-screen
if (dirs != nil) {
  let directories:[String] = dirs!;
  let dir = directories[0] + myDir; // iOS playground documents directory
  let path = dir.stringByAppendingPathComponent(file);

  //read
  let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)
  // works...
  println(content!)
}

请记住,您需要在Documents目录中创建一个名为"Shared Playground Data"的目录。 在我的情况下,我使用了以下命令: mkdir "/Users/joao_parana/Documents/Shared Playground Data"并将我的文件README.md放在README.md

回答8

String.stringWithContentsOfFile已弃用,并且在Xcode 6.1.1中不再起作用

创建您的documentDirectoryUrl

let documentDirectoryUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! as NSURL

为了确保文件位于此处,您可以使用查找程序命令“转到文件夹”,将打印的documentDirectoryUrl.path复制粘贴到此处。

println(documentDirectoryUrl.path!)
// should look like this: /Users/userName/Library/Containers/com.apple.dt.playground.stub.OSX.PLAYGROUNDFILENAME-5AF5B25D-D0D1-4B51-A297-00015EE97F13/Data/Documents

只需将文件名作为路径组件附加到文件夹url

let fileNameUrl = documentDirectoryUrl.URLByAppendingPathComponent("ReadMe.txt")
var fileOpenError:NSError?

尝试打开之前检查文件是否存在

if NSFileManager.defaultManager().fileExistsAtPath(fileNameUrl.path!) {

    if let fileContent = String(contentsOfURL: fileNameUrl, encoding: NSUTF8StringEncoding, error: &fileOpenError) {
        println(fileContent)        // prints ReadMe.txt contents if successful
    } else {
        if let fileOpenError = fileOpenError {
            println(fileOpenError)  // Error Domain=NSCocoaErrorDomain Code=XXX "The file “ReadMe.txt” couldn’t be opened because...."
        }
    }
} else {
    println("file not found")
}
回答9

我无法在操场上轻松读取文件,最终只是在Xcode中创建了一个command line应用程序。 这似乎对我非常有效。

回答10

依赖于“ playgroundSharedDataDirectory”的其他答案对我来说永远都行不通,尤其是在使用iOS游乐场的情况下。

 let documentsDirectoryShareURL = PlaygroundSupport.playgroundSharedDataDirectory.absoluteURL let fileManager = FileManager() try? fileManager.copyItem(at: URL(fileURLWithPath: "/Users/rufus/Documents/Shared Playground Data/"), to: documentsDirectoryShareURL)
我现在就做以上。 我可以填充我的文档/共享文件夹,并且只是手动将其自动复制到游乐场文档目录中。

我的代码不会覆盖那里存在的文件。 如果需要它可以查看文件时间戳记,然后在必要时进行复制等,则可以对此进行增强。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Swift Playground-文件不可读(Swift Playground - Files are not readable)
    问题 文件在Swift Playground中不可读。 如何使文件可读? 相同的代码在Xcode终端应用程序上运行良好,但在Swift Playground上失败。 下面的演示代码。 import Foundation println("Hello, World!") var fname:String = "/Users/holyfield/Desktop/com.apple.IconComposer.plist" var fm:NSFileManager = NSFileManager.defaultManager() if(fm.fileExistsAtPath(fname)){ println("File Exists") if(fm.isReadableFileAtPath(fname)){ println("File is readable") var fd:NSData? = NSData(contentsOfFile: fname) println(fd?.length) let pl = NSDictionary(contentsOfFile: fname) println(pl?.count) println(pl?.allKeys) }else{ println("File is not readable") } } else{ println("File
  • 如何从您自己的项目中将自己的类导入Playground(How to import own classes from your own project into a Playground)
    问题 假设这样的设置: 您有一个Xcode 6项目,在这里您已经用Objective-C和Swift实现了自己的类(例如MyView和MyViewController) 您已经在项目中添加了Playground 在Playground中,可以使用import关键字import类似UIKit模块(框架)。 您如何从Playground启用对项目其他班级的访问? 尝试直接访问项目类会直接导致错误消息:使用未解析的标识符'MyView' 回答1 从Xcode 6.0 Beta 5开始,现在可以将自己的框架导入操场。 这提供了一种在应用程序和Playground之间共享代码的方法,可以同时导入您的框架。 去做这个: 您的游乐场必须与生成框架的项目位于同一工作空间中。 您的工作区必须包含生成框架的目标,而不是使用预先构建的框架。 您必须已经构建了框架。 如果它是iOS框架,则必须为64位运行目标(例如iPhone 5s)构建,并且必须为模拟器构建。 您必须具有一个主动方案,该方案可以构建至少一个目标(该目标的构建位置将在游乐场的框架搜索路径中使用)。 您的“构建位置”首选项(在Xcode的高级“位置”设置中)不应设置为“旧版”。 如果您的框架不是Swift框架,则“ Defines Module”构建设置必须设置为“ Yes”。 您必须在框架的操场上添加导入语句。 一旦满足所有这些条件
  • 如何将第3方框架导入Xcode Playground?(How to I import 3rd party frameworks into Xcode Playground?)
    问题 如何将第三部分框架导入Xcode Playground? Swift Playground显然具有框架导入机制,因为我们可以导入Cocoa , SpriteKit和OSX Playground中的XCPlayground ( XCPlayground是,iOS中似乎缺少XCPlayground ) 我真正想做的是从操场上隐藏代码并能够显示一个最小的示例。 关于如何将框架加载到Swift游乐场有任何想法吗? 也可以看看: 如何从您自己的项目中将自己的类导入Playground 是否可以将第三方Objective-C代码导入Swift游乐场? (此问题有所不同,因为请求是在Playground中使用框架,而不是简单的常规swift文件) 回答1 编辑:从Beta5开始,当游乐场是将框架构建为目标的工作空间的一部分时,将支持此功能。 Apple开发人员论坛站点上有更多详细信息,但希望@Rick Ballard可以在此处将其添加到他的答案中,这应该成为该问题的明确答案。 不要再执行以下操作! 短期而言,虽然没有受支持的解决方案,但是如果要生成模块/框架,则可以将其复制到SDK的System/Library/Frameworks目录中,然后以与导入系统框架相同的方式import <#Module#> 。 对于OS X游乐场: /Applications/Xcode6-Beta.app
  • 如何使用Swift Playground打印到控制台?(How to print to console using swift playground?)
    问题 我一直在遵循Apple Guide的新语言快速指南,但是我不明白为什么右侧的栏只显示“ Hello,Playground”而不是“ Hello,world”。 有人可以解释为什么println没有被打印在右边吗? // Playground - noun: a place where people can play import Cocoa var str = "Hello, playground" println("Hello, world"); 回答1 在Xcode 6.3和更高版本(包括Xcode 7和8)中,控制台输出显示在运动场窗口底部的“调试”区域中(类似于项目中的显示位置)。 要显示它: 菜单:视图>调试区域>显示调试区域(⌘⇧Y) 单击工具栏中工作区布局小部件的中间按钮 单击窗口底部时间线旁边的三角形 任何写入控制台的内容,包括Swift的print语句(在Swift 2 beta中从println重命名)都显示在那里。 在较早的Xcode 6版本中(到目前为止,您可能应该无论如何都应进行升级)显示助手编辑器(例如,通过单击输出区域中某位旁边的小圆圈)。 控制台输出出现在此处。 回答2 您需要启用Show Assistant编辑器: 回答3 只需按Alt + Command + Enter打开助手编辑器。 助手编辑器将打开时间线视图。 默认情况下
  • 在Swift中将文本或数据追加到文本文件(Append text or data to text file in Swift)
    问题 我已经读过读写文本文件中的数据 我需要将数据(字符串)附加到文本文件的末尾。 一种明显的方法是从磁盘读取文件,然后将字符串追加到文件末尾再写回,但这效率不高,尤其是在处理大型文件且经常执行的情况下。 因此,问题是“如何在不读取文件并将整个内容写回的情况下,将字符串附加到文本文件的末尾”? 到目前为止,我有: let dir:NSURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.CachesDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last as NSURL let fileurl = dir.URLByAppendingPathComponent("log.txt") var err:NSError? // until we find a way to append stuff to files if let current_content_of_file = NSString(contentsOfURL: fileurl, encoding: NSUTF8StringEncoding, error: &err) { "\(current_content_of_file)\n\(NSDate())
  • 如何快速获取当前在屏幕上的所有窗口的列表?(How can I get a list of all windows, currently on the screen, in swift?)
    问题 我怎样才能获得的所有窗口的列表,当前在屏幕上,在迅速? (所有示例都在import Cocoa之前) 在Objective-C中,我可以成功运行以下代码: CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 但是当我迅速运行等效项时(使用操场进行测试): let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID) 我收到一条错误消息,告诉我我有Use of unresolved identifier 'kcGNullWindowID' 。 在石英文档的帮助下玩了一段时间之后,我得到了: let windowList = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowListOption(0)) 但是它仍然无法正常工作,因为我收到了一个{__NSArrayM}对象,我不知道该如何访问。 我是在正确的道路上还是在做根本上是错误的事情? 回答1 这是Swift 2.0中的示例
  • 带有UIImage的Swift游乐场(Swift playgrounds with UIImage)
    问题 我正在使用Xcode 6,并且正在尝试重新创建在会话401“ Xcode 6的新功能”中演示的代码。 我已将图像添加到Images.xcassets(称为Sample),并且在运动场文件中尝试按演示方式访问该图像。 我的代码如下(如演示): var sample = UIImage(named: "Sample") 但是,我无法使其像演示一样工作。 我想念什么吗? 回答1 在Finder中打开.playground文件。 在它旁边创建一个名为Resources的文件夹。 将您想要的任何图像添加到此文件夹。 在操场上,按opt-cmd-1打开File Inspector。 您应该会在右边看到游乐场。 如果尚未选择,请按cmd-1打开“项目导航器”,然后单击“游乐场”文件。 在“资源路径”下,选择“相对于游乐场” 单击下面的文件夹图标,然后选择先前创建的资源文件夹。 现在,您应该拥有一个可以与标准NSImage一起使用的捆绑软件(名称:“ filename_without_extension”): 注意:因为Xcode会经常覆盖.playground文件夹,所以我建议使用此方法,这样资源文件夹就不会经常删除和重新创建。 回答2 查看iOS开发者库->游乐场帮助并搜索“资源文件”,您将找到答案 1,打开.playground 2,通过选择视图>导航器>显示项目导航器来显示项目导航器
  • Swift中的指针,指针算术和原始数据(Pointers, Pointer Arithmetic, and Raw Data in Swift)
    问题 我的应用程序使用某种复杂的不可变数据结构,该结构以二进制文件编码。 我需要在字节级别访问它,避免任何复制。 通常,我将使用C或C ++指针算术和类型转换来访问和解释原始字节值。 我想对Swift做同样的事情。 我发现以下作品: class RawData { var data: NSData! init(rawData: NSData) { data = rawData } func read<T>(byteLocation: Int) -> T { let bytes = data.subdataWithRange(NSMakeRange(byteLocation, sizeof(T))).bytes return UnsafePointer<T>(bytes).memory } func example_ReadAnIntAtByteLocation5() -> Int { return read(5) as Int } } 但是,我不确定它的效率如何。 每次我调用data.subdataWithRange和NSMakeRange分配对象,还是它们只是用于处理指针的语法糖? 在Swift中有更好的方法吗? 编辑: 我创建了一个小的Objective-C类,该类只封装了一个将指针偏移给定字节数的函数: @implementation RawDataOffsetPointer
  • 如何在Swift中更改为某种类型显示的文本表示形式?(How can I change the textual representation displayed for a type in Swift?)
    问题 如何修改在字符串插值中显示的文本输出? Printable协议看起来最明显,但是在String Interpolation和打印实例时都会被忽略,例如: struct Point : Printable { var x = 0 var y = 0 var description : String { return "(\(x), \(y))" } func toString() -> String { return description } } 同样, toString()约定也无效: var p = Point(x: 10, y: 20) println(p) // V11lldb_expr_05Point (has 2 children) println("\(p)") // V11lldb_expr_05Point (has 2 children) println(p.description) // (10, 20) println("\(p.description)") // (10, 20) PlayGround的行为又有所不同,PlayGround使用其自己的String表示结构,即: p // {x 10, y 20} 有什么方法可以更改实例的显示方式吗? 回答1 迅捷2-4 概括
  • 从文本文件读取和写入字符串(Read and write a String from text file)
    问题 我需要向/从文本文件读取数据或将数据写入文本文件,但我一直无法弄清楚该怎么做。 我在Swift的iBook中找到了此示例代码,但我仍然不知道如何写入或读取数据。 import Cocoa class DataImporter { /* DataImporter is a class to import data from an external file. The class is assumed to take a non-trivial amount of time to initialize. */ var fileName = "data.txt" // the DataImporter class would provide data importing functionality here } class DataManager { @lazy var importer = DataImporter() var data = String[]() // the DataManager class would provide data management functionality here } let manager = DataManager() manager.data += "Some data" manager.data += "Some more
  • 快速获取dataTaskWithURL的进度(get progress from dataTaskWithURL in swift)
    问题 下载数据时,有什么方法可以迅速从dataTaskWithURL获取进度吗? NSURLSession.sharedSession().dataTaskWithURL(...) 下载数据时,我需要显示进度栏。 回答1 您可以使用此代码通过进度条及其委托功能来显示下载过程。 import UIKit class ViewController: UIViewController,NSURLSessionDelegate,NSURLSessionDataDelegate{ @IBOutlet weak var progress: UIProgressView! var buffer:NSMutableData = NSMutableData() var session:NSURLSession? var dataTask:NSURLSessionDataTask? let url = NSURL(string:"http://i.stack.imgur.com/b8zkg.png" )! var expectedContentLength = 0 override func viewDidLoad() { super.viewDidLoad() progress.progress = 0.0 let configuration = NSURLSessionConfiguration
  • 快速语言中的结构与类(structure vs class in swift language)
    问题 苹果公司的书“结构和类之间最重要的区别之一是,结构在代码中传递时总是被复制,而类是通过引用传递的。” 谁能帮助我了解这意味着什么? 对我来说,类和结构似乎是相同的。 回答1 这是一个带有class的示例。 请注意,更改名称后,两个变量引用的实例如何更新。 现在, Bob成为Sue , Bob曾经被引用过的任何地方。 class SomeClass { var name: String init(name: String) { self.name = name } } var aClass = SomeClass(name: "Bob") var bClass = aClass // aClass and bClass now reference the same instance! bClass.name = "Sue" println(aClass.name) // "Sue" println(bClass.name) // "Sue" 现在有了一个struct我们看到了值被复制,并且每个变量都保留了自己的一组值。 当我们将名称设置为Sue , aStruct中的Bob结构不会更改。 struct SomeStruct { var name: String init(name: String) { self.name = name } } var aStruct =
  • Swift有文档生成支持吗?(Does Swift have documentation generation support?)
    问题 许多语言都支持文档注释,以允许生成器(如javadoc或doxygen)通过解析相同的代码来生成代码文档。 Swift是否有像这样的任何类型文档注释功能? 回答1 Xcode本身支持文档注释,可在快速帮助中生成智能呈现的文档(在⌥单击符号时在弹出窗口中,以及在快速帮助检查器⌥⌘2中)。 现在,符号文档注释基于丰富的游乐场注释所使用的Markdown语法,因此,您可以在游乐场中执行的许多操作现在都可以直接在源代码文档中使用。 有关语法的完整详细信息,请参见《标记格式参考》。 请注意,丰富的游乐场注释和符号文档的语法之间存在一些差异。 这些在文档中指出(例如,块引用只能在操场上使用)。 下面是一个示例以及当前可用于符号文档注释的语法元素列表。 更新 Xcode 7 beta 4〜添加了“ - Throws: ... ”作为顶级列表项,它与参数并在快速帮助中返回说明一起出现。 Xcode 7 beta 1〜对Swift 2的语法进行了一些重大更改-现在基于Markdown的文档注释(与游乐场相同)。 Xcode 6.3(6D570)〜缩进的文本现在被格式化为代码块,随后的缩进被嵌套。 在这样的代码块中似乎不可能留空行-尝试这样做会导致文本被粘贴到最后一行的末尾,其中包含任何字符。 Xcode 6.3 beta〜内联代码现在可以使用反引号添加到文档注释中。 Swift 2示例 ///
  • 如何在Swift中将plist作为字典?(How do I get a plist as a Dictionary in Swift?)
    问题 我正在玩苹果的新Swift编程语言,遇到了一些问题... 当前,我正在尝试读取plist文件,在Objective-C中,我将执行以下操作以将内容作为NSDictionary获取: NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"]; NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath]; 如何在Swift中将plist作为字典? 我假设我可以通过以下方式获取到plist的路径: let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist") 当这可行时(如果正确的话?):如何将内容作为字典? 还有一个更笼统的问题: 是否可以使用默认的NS *类? 我想是...还是我错过了什么? 据我所知,默认框架NS *类仍然有效并且可以使用吗? 回答1 在Swift 3.0中,从Plist读取。 func readPropertyList() { var propertyListFormat = PropertyListSerialization.PropertyListFormat
  • 如何引用Swift Playground本身?(How to reference Swift Playground itself?)
    问题 从如何以编程方式创建按钮? 自我在迅速的操场上不起作用: button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside) 错误 : 游乐场执行失败:错误::42:13:错误:使用未解决的标识符“自我” 我也尝试创建一个内部带有buttonAction方法的类,但该类可以编译,但是当我单击该按钮时,控制台中不会打印任何内容 import UIKit class myself { func buttonAction(sender:UIButton!) { println("Button tapped") } } var s = myself() // Create View var f = CGRect(x:0,y:0,width:200,height:200) var view = UIView(frame:f) // Create Button var b = UIButton(frame: f) b.setTitle("Hello", forState: UIControlState.Normal) b.addTarget(s, action: "buttonAction:", forControlEvents: UIControlEvents
  • SourceKitService已终止(SourceKitService Terminated)
    问题 我在Xcode上遇到问题,错误“ Source Kit Service Terminated”弹出,并且所有语法突出显示和代码完成在Swift中都消失了。 我怎样才能解决这个问题? 这是一个示例图像: 回答1 我的答案(Xcode6-Beta7)只是删除Derived Data文件夹。 Preferences > Locations > Derived Data > click the arrow to open in Finder > trash it. 希望这对某人有帮助。 显然有很多原因可以导致此崩溃。 回答2 我相信我可能已经找到了更通用的解决方案。 下面是我用来鼓励Xcode不产生SourceKitService Terminated错误的步骤。 我出现的症状: 当我启动一个新的游乐场时,我将收到一个关于无法与游乐场进行通信的Error running playground: Failed prepare for communication with playground. ( Error running playground: Failed prepare for communication with playground.请参见Twitter上的此图像。 当我将游乐场从OS X切换到iOS ,我会收到另一个错误(不幸的是我没有写下那个错误)。
  • 将os.Stdin填充为从中读取的函数(Fill os.Stdin for function that reads from it)
    问题 如何在我的测试中填写os.Stdin中使用扫描仪从中读取的功能? 我要求使用以下功能通过扫描仪输入用户命令行: func userInput() error { scanner := bufio.NewScanner(os.Stdin) println("What is your name?") scanner.Scan() username = scanner.Text() /* ... */ } 现在如何测试这种情况并模拟用户输入? 以下示例不起作用。 Stdin还是空的。 func TestUserInput(t *testing.T) { var file *os.File file.Write([]byte("Tom")) os.Stdin = file err := userInput() /* ... */ } 回答1 嘲讽os.Stdin 您在正确的位置上知道os.Stdin是可以修改的变量(* os.File类型),可以在测试中为其分配新值。 最简单的方法是创建一个临时文件,将要模拟的内容作为os.Stdin的输入。 要创建临时文件,请使用ioutil.TempFile()。 然后将内容写入其中,并返回到文件的开头。 现在,您可以将其设置为os.Stdin并执行测试。 不要忘记清理临时文件。 我将您的userInput()修改为: func
  • Swift-字典中的存储值顺序已完全更改(Swift - Stored values order is completely changed in Dictionary)
    问题 我试图显示字典格式的数据。 下面是三个尝试。 第一次尝试,输出顺序将完全更改。 第二次尝试,输出顺序与输入相同。 但是,在第三次尝试中,我将变量声明为NSDictionary。 我收到的确切输出。 为什么字典会发生变化? 请指导我。 我搜索了Swift的Dictionary标签。 但是我找不到。 //First Attempt var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"] println(dict) //output: [name2: Roy, name1: Loy] //Second Attempt var dict : Dictionary = ["name2" : "Loy", "name1" : "Roy"] println(dict) //output: [name2: Loy, name1: Roy] ----------------------------------------------------------- //Third Attempt With NSDictionary var dict : NSDictionary = ["name1" : "Loy", "name2" : "Roy"] println(dict) //output: { name1 = Loy; name2
  • Swift Beta性能:对数组进行排序(Swift Beta performance: sorting arrays)
    问题 我在Swift Beta中实现一种算法,并注意到性能很差。 深入研究后,我意识到瓶颈之一就是对数组进行排序一样简单。 相关部分在这里: let n = 1000000 var x = [Int](repeating: 0, count: n) for i in 0..<n { x[i] = random() } // start clock here let y = sort(x) // stop clock here 在C ++中,类似的操作在我的计算机上耗时0.06s 。 在Python中,它花费0.6秒(绝招,仅y =整数列表的sorted(x))。 在Swift中,如果使用以下命令进行编译,则需要6s : xcrun swift -O3 -sdk `xcrun --show-sdk-path --sdk macosx` 如果使用以下命令进行编译,则最多需要88s : xcrun swift -O0 -sdk `xcrun --show-sdk-path --sdk macosx` Xcode中具有“发布”与“调试”构建的时序是相似的。 这是怎么了与C ++相比,我可以理解一些性能损失,但与纯Python相比,却不能将性能降低10倍。 编辑:天气注意到,将-O3更改为-Ofast使此代码的运行几乎与C ++版本一样快! 但是, -Ofast改变了语言的语义-在我的测试中
  • 如何使用JavaScript读写文件?(How to read and write into file using JavaScript?)
    问题 有人可以提供一些示例代码来使用JavaScript读写文件吗? 回答1 为了完整起见,OP并未声明他希望在浏览器中执行此操作(如前所述,如果不可能,通常是不可能的) 但是javascript本身确实允许这样做; 可以使用服务器端javascript来完成。 请参阅Javascript File类上的此文档 编辑:该链接是Oracle现在已移动的Sun文档。 为了与时俱进,这里是FileSystem类的node.js文档:http://nodejs.org/docs/latest/api/fs.html Edit(2) :您现在可以使用HTML5在客户端读取文件:http://www.html5rocks.com/en/tutorials/file/dndfiles/ 回答2 否。在不必禁用许多安全选项的情况下,浏览器端javascript没有写入客户端计算机的权限 回答3 未来就在这里! 提案已接近完成,不再需要ActiveX或Flash或Java。 现在我们可以使用: 文件系统API 本机拖放文件访问 您可以使用“拖放”将文件导入浏览器,也可以使用简单的上传控件。 用户选择了文件后,就可以使用Javascript读取文件:http://www.html5rocks.com/zh-CN/tutorials/file/dndfiles/ 回答4 这是mozilla的建议