我最近将xcode更新到版本9.在Xcode 8.x之前,每当我使用pod update它时,它会向我显示一个更新代码,将代码转换为Swift 3并执行此操作来解决错误.但现在它给了我这个错误:
必须将"Swift语言版本"(SWIFT_VERSION)构建设置设置为使用Swift的目标支持的值.可以在构建设置编辑器中设置此设置.
对于这个错误我试过Build Settings > Swift Language Version,它是Swift 3.2但是由于更新调用重新安装了一些像Alamofire的pod,它说要安装Xcode 8.x将代码转换为Swift 3所以我需要安装一个使用最新Xcode的附加版本?如果是,那么如何使用Xcode 9安装Xcode 8?
我正在socket.io我的swift ios应用程序中实现.
目前在几个面板上我正在监听服务器并等待收到的消息.我这样做是通过调用getChatMessage每个面板中的函数来实现的:
func getChatMessage(){
SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//do sth depending on which panel user is
})
}
}
Run Code Online (Sandbox Code Playgroud)
但是我注意到这是一个错误的方法,我需要更改它 - 现在我想开始只收听一次传入消息,当任何消息到来时 - 将此消息传递给任何监听它的面板.
所以我想通过NSNotificationCenter传递传入的消息.到目前为止,我能够传递发生的事情的信息,但不能传递数据本身.我是这样做的:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)
Run Code Online (Sandbox Code Playgroud)
然后我有一个叫做的函数:
func showSpinningWheel(notification: NSNotification) {
}
Run Code Online (Sandbox Code Playgroud)
任何时候我想打电话给我:
NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)
Run Code Online (Sandbox Code Playgroud)
那么如何传递对象messageInfo并将其包含在被调用的函数中?
在swift 2.0中,print()自动添加换行符.在迅速1.2,println()和print()以前是独立的功能.那么如何打印一些文本而不添加换行符,因为swift不再具有不附加换行符的打印功能.
在Swift 2中,以下代码正在运行:
let request = NSFetchRequest(entityName: String)
Run Code Online (Sandbox Code Playgroud)
但是在Swift 3中它给出了错误:
无法推断通用参数"ResultType"
因为NSFetchRequest现在是通用类型.他们在文件中写道:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
Run Code Online (Sandbox Code Playgroud)
所以如果我的结果类是例如Level我应该如何正确请求?
因为这不起作用:
let request: NSFetchRequest<Level> = Level.fetchRequest
Run Code Online (Sandbox Code Playgroud) 我刚刚从Xcode 7更新到8 GM并且在Swift 3兼容性问题中我注意到我的设备令牌已停止工作.他们现在只读'32BYTES'.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Run Code Online (Sandbox Code Playgroud)
在更新之前,我能够简单地将NSData发送到我的服务器,但现在我很难解析令牌.
我在这里错过了什么?
编辑:我只是测试转换回NSData,我看到了预期的结果.所以现在我只是对新数据类型感到困惑.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
let d = NSData(data: deviceToken)
print(d) // Prints my device token
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行从应用程序下载的文件,尝试在Xcode中打开并出现错误:
“显示最近的消息
:-1:不支持SWIFT_VERSION'3.0',支持的版本是:4.0、4.2、5.0。(在目标'SimpleWeather'中)”
我正在学习Swift 3,我正在尝试使用它NSNotificationCenter.这是我的代码:
func savePost(){
let postData = NSKeyedArchiver.archivedData(withRootObject: _loadedpost)
UserDefaults.standard().object(forKey: KEY_POST)
}
func loadPost(){
if let postData = UserDefaults.standard().object(forKey: KEY_POST) as? NSData{
if let postArray = NSKeyedUnarchiver.unarchiveObject(with: postData as Data) as? [Post]{
_loadedpost = postArray
}
}
//codeerror
NotificationCenter.default().post(NSNotification(name: "loadedPost" as NSNotification.Name, object: nil) as Notification)
}
Run Code Online (Sandbox Code Playgroud)
这是观察者:
override func viewDidLoad() {
super.viewDidLoad()
//codeerorr
NotificationCenter.default().addObserver(self, selector: Selector(("onPostLoaded")), name: "loadedPost", object: nil)
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
Run Code Online (Sandbox Code Playgroud)
它总是给我错误"信号SIGBRT".当我尝试在观察者中更改名称时,这不是错误,但显然它没有显示任何内容.我该如何解决?
使用扩展代码时出现以下错误,我不确定他们是否要求使用其他运算符或根据Internet搜索修改表达式中的值.
错误:%不可用:改为使用truncatingRemainder
扩展代码:
extension CMTime {
var durationText:String {
let totalSeconds = CMTimeGetSeconds(self)
let hours:Int = Int(totalSeconds / 3600)
let minutes:Int = Int(totalSeconds % 3600 / 60)
let seconds:Int = Int(totalSeconds % 60)
if hours > 0 {
return String(format: "%i:%02i:%02i", hours, minutes, seconds)
} else {
return String(format: "%02i:%02i", minutes, seconds)
}
}
}
Run Code Online (Sandbox Code Playgroud)
设置分钟和秒变量时会发生错误.
Non-'@objc' method 'presentationController(_:viewControllerForAdaptivePresentationStyle:)' does not satisfy optional requirement of '@objc' protocol 'UIAdaptivePresentationControllerDelegate'
Run Code Online (Sandbox Code Playgroud)
@objc但没有帮助@objc protocol P1 : UIAdaptivePresentationControllerDelegate {
}
extension P1 where Self : UIViewController {
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
return UIViewController()
}
}
class A : UIViewController, P1 {
}
Run Code Online (Sandbox Code Playgroud) 如何检查哪一个是Swift 3中的当前线程?
在Swift的早期版本中,可以通过执行以下操作来检查当前线程是否是主要线程:
NSThread.isMainThread()
Run Code Online (Sandbox Code Playgroud)