在Apple的使用Swift with Cocoa和Objective-C文档(针对Swift 3更新)中,他们给出了以下Singleton模式的示例:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
Run Code Online (Sandbox Code Playgroud)
让我们假设这个单例需要管理一个可变的字符串数组.如何/在哪里声明该属性并确保它被正确初始化为空[String]数组?
由于Swift 3倾向于Data而不是[UInt8],我试图找出最有效/惯用的编码/解码方式将各种数字类型(UInt8,Double,Float,Int64等)作为数据对象.
对于使用[UInt8]有这个答案,但它似乎使用了我在Data上找不到的各种指针API.
我想基本上一些自定义扩展看起来像:
let input = 42.13 // implicit Double
let bytes = input.data
let roundtrip = bytes.to(Double) // --> 42.13
Run Code Online (Sandbox Code Playgroud)
真正逃避我的部分,我已经查看了一堆文档,我是如何从任何基本结构(所有数字都是)得到某种指针的东西(OpaquePointer或BufferPointer或UnsafePointer?).在C中,我只是在它前面拍一个&符号,然后就去了.
我怎么能让我的代码等到DispatchQueue中的任务完成?它需要任何CompletionHandler或其他东西吗?
func myFunction() {
var a: Int?
DispatchQueue.main.async {
var b: Int = 3
a = b
}
// wait until the task finishes, then print
print(a) // - this will contain nil, of course, because it
// will execute before the code above
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Xcode 8.2并在Swift 3中编写.
multithreading asynchronous grand-central-dispatch swift swift3
我一直在使用DispatchQueue.main.async很长一段时间来执行一些与UI相关的操作.但Swift提供了DispatchQueue.main.async和DispatchQueue.main.sync,两者都在主队列中执行.那么有谁可以告诉我他们之间的区别?我什么时候应该使用它们?先感谢您.
DispatchQueue.main.async {
self.imageView.image = imageView
self.lbltitle.text = ""
}
DispatchQueue.main.sync {
self.imageView.image = imageView
self.lbltitle.text = ""
}
Run Code Online (Sandbox Code Playgroud) 从beta 8.3开始,zillions警告"字符串插值会为可选值生成调试描述;你的意思是明确说明吗?" 出现在我的代码中.
例如,警告在以下情况下弹出,其中选项可能导致nil:
let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"
Run Code Online (Sandbox Code Playgroud)
如前所述,我(和编译器)可以将选项插值为'nil'.但是编译器改变了主意.
编译器建议添加一个带有描述的String构造函数,如下所示:
let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"
Run Code Online (Sandbox Code Playgroud)
显然,结果是明确的,但在我看来也非常麻烦.有更好的选择吗?我是否必须修复所有警告或更好等待下一个测试版?
我已经将我的代码更新为Xcode 8.0 beta 6,但我似乎陷入了关于新的非转义关闭默认值的问题.在下面的代码中,Xcode建议在下面代码的第一行@escaping前面添加completion:,但是仍然不会编译并进入圆圈.*
(编辑:事实上,@scaping应该在之后 添加completion:,正如Xcode建议的那样.警报可能仍然显示,但清理和编译将删除它.)*如何重新编写/修复此代码以在更新的Swift 3中工作?我看过新手册,但找不到合适的代码示例.
func doSomething(withParameter parameter: Int, completion: () -> ()) {
// Does something
callSomeOtherFunc(withCompletion: completion)
}
// Calling the method and execute closure
doSomething(withParameter: 2) {
// do things in closure
}
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢!
我一直在做一些关于CoreLocation的研究.最近,我遇到了其他地方已经涉及的问题,但是在Objective C和iOS 8中.
我觉得有点傻傻问这个,但是如何在iOS 9上检查是否使用swift启用了位置服务?
在iOS 7(可能是8?)上你可以使用locationServicesEnabled(),但在编译iOS 9时似乎没有用.
那我怎么做到这一点?
谢谢!
我为什么要这个?
objc [3993]:类PLBuildVersion在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices(0x112bb0910)中实现和/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices(0x1129da210).将使用两者之一.哪一个未定义.2016-09-15 19:06:45.101896 Fly App [3993:92356]子系统:com.apple.UIKit,类别:HIDEventFiltered,enable_level:0,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms :0,enable_oversize:1,privacy_setting:2,enable_private_data:0 2016-09-15 19:06:45.108211 Fly App [3993:92356] subsystem:com.apple.UIKit,category:HIDEventIncoming,enable_level:0,persist_level:0 ,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms:0,enable_oversize:1,privacy_setting:2,enable_private_data:0 2016-09-15 19:06:45.118565 Fly App [3993:92353]子系统:com.apple .BaseBoard,类别:MachPort,enable_level:1,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms:0,enable_oversize:0,privacy_setting:0,enable_private_data:0 2016-09-15 19:06 :45.153130 Fly App [3993:92250]子系统:com.apple.UIKit,类别:StatusBar,enable_level:0,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms:0,enable_ove rsize:1,privacy_setting:2,enable_private_data:0 2016-09-15 19:06:45.537455 Fly App [3993:92250] subsystem:com.apple.BackBoardServices.fence,category:App,enable_level:1,persist_level:0, default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms:0,enable_oversize:0,privacy_setting:0,enable_private_data:0
有什么理由吗?(直到今天更新后的xcode,并将我的项目更新为swift 3之前从未发生过)
有人可以帮忙吗?
*已编辑*
我不相信开发商给出的建议,所以我一直在寻找答案.我发现一个帖子说这个问题似乎已经被Facebook SDK所取代.但是我还没有在我的项目上安装Facebook SDK(Cocoapod),但是我使用Import Social在Twitter上分享,所以我删除了Import Social并再次运行了我的项目.
这次我没有在调试器上获得相同的输出,而是得到了这个:
2016-09-16 11:57:41.393517 Fly App [1277:48009]子系统:com.apple.UIKit,类别:HIDEventFiltered,enable_level:0,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms :0,enable_oversize:1,privacy_setting:2,enable_private_data:0
2016-09-16 11:57:41.396355 Fly App [1277:48009]子系统:com.apple.UIKit,类别:HIDEventIncoming,enable_level:0,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms :0,enable_oversize:1,privacy_setting:2,enable_private_data:0
2016-09-16 11:57:41.411055 Fly App [1277:48006]子系统:com.apple.BaseBoard,类别:MachPort,enable_level:1,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms :0,enable_oversize:0,privacy_setting:0,enable_private_data:0
2016-09-16 11:57:41.426085 Fly App [1277:47901]子系统:com.apple.UIKit,类别:StatusBar,enable_level:0,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0,generate_symptoms :0,enable_oversize:1,privacy_setting:2,enable_private_data:0
2016-09-16 11:57:41.946193 Fly App [1277:47901]子系统:com.apple.BackBoardServices.fence,类别:App,enable_level:1,persist_level:0,default_ttl:0,info_ttl:0,debug_ttl:0 ,generate_symptoms:0,enable_oversize:0,privacy_setting:0,enable_private_data:0
所以"Class PLBuildVersion在两者中实现"都没有了:
objc [3993]:类PLBuildVersion在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices(0x112bb0910)中实现和/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices(0x1129da210).将使用两者之一.哪一个未定义.
我还是不知道这一切意味着什么.有人找到了解决这个问题的方法吗?
为什么在Swift 3中使用字符串插值时,隐式解包的选项不会被解包?
示例:在操场中运行以下代码
var str: String!
str = "Hello"
print("The following should not be printed as an optional: \(str)")
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
The following should not be printed as an optional: Optional("Hello")
Run Code Online (Sandbox Code Playgroud)
当然我可以用+运算符连接字符串,但我在我的应用程序中几乎无处不在使用字符串插值,现在因为这个而无法工作(bug?).
这甚至是一个bug还是他们故意用Swift 3改变这种行为?
swift3 ×10
swift ×7
ios ×4
xcode ×2
asynchronous ×1
beta ×1
closures ×1
concurrency ×1
escaping ×1
ios9 ×1
location ×1
optional ×1
singleton ×1
string ×1
swift-data ×1