如何在swift中将数组转换为JSON字符串?基本上我有一个嵌入按钮的文本字段.按下按钮时,文本字段文本将添加到testArray
.此外,我想将此数组转换为JSON字符串.
这是我尝试过的:
func addButtonPressed() {
if goalsTextField.text == "" {
// Do nothing
} else {
testArray.append(goalsTextField.text)
goalsTableView.reloadData()
saveDatatoDictionary()
}
}
func saveDatatoDictionary() {
data = NSKeyedArchiver.archivedDataWithRootObject(testArray)
newData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(), error: nil) as? NSData
string = NSString(data: newData!, encoding: NSUTF8StringEncoding)
println(string)
}
Run Code Online (Sandbox Code Playgroud)
我还想使用我的方法返回JSON字符串savetoDictionart()
.
这是Place
我定义的一个类:
class Place: NSObject {
var latitude: Double
var longitude: Double
init(lat: Double, lng: Double, name: String){
self.latitude = lat
self.longitude = lng
}
required init(coder aDecoder: NSCoder) {
self.latitude = aDecoder.decodeDoubleForKey("latitude")
self.longitude = aDecoder.decodeDoubleForKey("longitude")
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeObject(latitude, forKey: "latitude")
aCoder.encodeObject(longitude, forKey: "longitude")
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我试图保存Place
s 数组的方法:
var placesArray = [Place]
//...
func savePlaces() {
NSUserDefaults.standardUserDefaults().setObject(placesArray, forKey: "places")
println("place saved")
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,这是我在控制台上得到的:
Property list invalid for format: 200 (property lists cannot contain objects …
Run Code Online (Sandbox Code Playgroud) 我一直在设置UIDatePicker
字体和颜色时遇到麻烦.我的应用程序中的其他所有内容都非常简单,除此之外.有人知道怎么做这个吗?我正在使用Swift for iOS8.
例如,如果我要编写此代码:
var t = time_t()
time(&t)
let x = localtime(&t) // returns UnsafeMutablePointer<tm>
println("\(x.memory.tm_hour): \(x.memory.tm_min): \(x.memory.tm_sec)")
Run Code Online (Sandbox Code Playgroud)
......是否还需要做以下事情?
x.destroy()
x.dealloc(1)
Run Code Online (Sandbox Code Playgroud)
或者我们没有分配内存,因此不需要解雇它?
如果我们想象一个函数返回一个UnsafeMutablePointer
:
func point() -> UnsafeMutablePointer<String> {
let a = UnsafeMutablePointer<String>.alloc(1)
a.initialize("Hello, world!")
return a
}
Run Code Online (Sandbox Code Playgroud)
调用此函数将导致指向一个永远不会被销毁的对象的指针,除非我们自己做脏工作.
我在这里问的问题是:从一个localtime()
呼叫收到的指针有什么不同吗?
模拟器和操场都使我们能够向dealloc(1)
返回的指针发送一个调用,但是我们应该这样做还是稍后通过其他方法对返回的指针进行解除分配?
目前我错误地认为我们确实需要销毁和释放.
最后的假设是错误的.我不需要发布,因为我没有创建对象.
我在Apple dev论坛上收到了相同查询的一些答案.
一般来说,你的问题的答案是肯定的.如果你收到一个指向你将负责在C中释放的内存的指针,那么你仍然有责任在从swift调用时释放它... [但]在这种特殊情况下你不需要做任何事情.(JQ)
例程本身为结果维护静态内存,您不需要释放它们.(如果你这样做可能会是一件"坏事")...一般来说,你不知道是否需要释放UnsafePointer所指向的东西....它取决于指针获取其值的位置.(ST)
UnsafePointer的dealloc()与free()不兼容.将alloc()与dealloc()和malloc和co配对.用free().如前所述,您正在调用的函数应该告诉您是否是您对释放结果的响应...只有在指针引用的内存中有非平凡的内容*时才需要destroy(),例如强引用或Swift结构或枚举.一般来说,如果它来自C,你可能不需要销毁()它.(事实上,你可能不应该销毁()它,因为它没有被Swift初始化.)......*"非平凡的内容"并不是官方的Swift术语.我正在使用类比C++概念"平凡可复制"(虽然不一定是"微不足道").(STE)
我现在写了一篇博客文章,概述了关于发布不安全指针的发现和假设,这些指针从StackOverflow,Apple Dev论坛,Twitter和Apple关于分配内存和释放它的旧文档(ARC之前)获取信息.看到这里.
我想知道如何从另一个类访问类中声明的@IBOutlet
例如,我有一个名为myfirstview的类
class MyFirstView: UIViewController {
@IBOutlet var lblred: UILabel! = UILabel()
}
Run Code Online (Sandbox Code Playgroud)
我想改变的文本lblred
从另一个名为类MySecondView
这是写在另一个.swift
文件中:
class MySecondView: UIViewController {
func modify() {
let mfv = MyFirstView()
mfv.lblred.text = "Hello"
}
}
Run Code Online (Sandbox Code Playgroud)
但没有任何反应.
我已经连接lblred
了故事板标签.我在网上搜索了很多关于这个但我找不到可以解决我问题的那个.请帮我解决这个问题.
谢谢.
我发现很难理解LLVM C++ API.我想问你一下吗?LLVM C++ API和LLVM IR之间有什么关系吗?另外,我想知道如何使用LLVM C++ API?
我遇到了一个问题,我无法理解为我的生活.我搜索了互联网,试图了解Swifts的EXC_BAD_ACCESS
,但似乎没有任何帮助.
以下代码很长,但大多数时候注释都是理解相关项所需的所有信息.
我有一个类CalculatorController
,其中包含以下相关方法和属性:
import UIKit
class CalculatorController: UIViewController {
// the actual `@IBOutlet` which is never accessed directly
@IBOutlet private weak var _mainDisplay: UILabel!
// an instance of `MainDisplayMicroController`
// holds a reference to `_mainDisplay`
// is used to manipulate `_mainDisplay` in a controlled way
private var mainDisplay: MainDisplayMicroController!
override func viewDidLoad() {
super.viewDidLoad()
// connects `mainDisplay` with `_mainDisplay`
mainDisplay = MainDisplayMicroController(label: _mainDisplay)
// sets `_mainDisplay`'s `text` property to "0"
mainDisplay.content = .Number(0)
//...
}
//... …
Run Code Online (Sandbox Code Playgroud) 当正常使用for-in-loop时,计数器(在这种情况下number
)在每次迭代中都是一个常量:
for number in 1...10 {
// do something
}
Run Code Online (Sandbox Code Playgroud)
这意味着我无法改变number
循环:
for number in 1...10 {
if number == 5 {
++number
}
}
// doesn't compile, since the prefix operator '++' can't be performed on the constant 'number'
Run Code Online (Sandbox Code Playgroud)
有没有办法声明number
为变量,而不是在循环之前声明它,或使用正常的for循环(具有初始化,条件和增量)?
让我说我有这个class
:
class Node {
var value: String
var children: [Node]?
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个属性的名称(例如"children"
)我怎么能得到它的类型?(在这种情况下[Node]?
)
我想像下面这样的全局函数可以解决我的需求:
func typeOfPropertyWithName(name: String, ofClass: AnyClass) -> AnyClass? {
//???
}
// Example usage:
var arrayOfNodesClass = typeOfPropertyWithName("children", Node.self)
Run Code Online (Sandbox Code Playgroud) 假设我有这段代码:
func work<S: Sequence>(sequence: S) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我怎么能弄清楚有多少元素sequence
?
我想要的明显版本是非常低效的:
var count = 0
for element in sequence {
count += 1
}
Run Code Online (Sandbox Code Playgroud)
必须有一个更好的方式,对吧?
swift ×9
ios ×4
iboutlet ×2
allocation ×1
constants ×1
count ×1
dealloc ×1
declaration ×1
destroy ×1
for-in-loop ×1
iphone ×1
json ×1
llvm ×1
llvm-c++-api ×1
reflection ×1
sequence ×1
string ×1
uidatepicker ×1
uilabel ×1
variables ×1