简而言之,在使用Xcode 9 Beta时,我遇到了以下警告:
不推荐在Swift 4模式下使用Swift 3 @objc推理.请解决已弃用的@objc推理警告,使用"使用已弃用的Swift 3 @objc推理"日志记录测试代码,并禁用Swift 3 @objc推理.**
经过一番研究,我仍然不知道如何解决这个问题.我将非常感谢有关如何解决此问题的任何提示以及对正在发生的事情的解释.
我的目标是更好地理解我的代码发生了什么.
我试图将一个额外的参数传递给buttonClicked操作,但无法确定Swift中的语法应该是什么.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Run Code Online (Sandbox Code Playgroud)
任何我的buttonClicked方法:
func buttonClicked(sender:UIButton)
{
println("hello")
}
Run Code Online (Sandbox Code Playgroud)
任何想法?
谢谢你的帮助.
使用最新的Xcode 9 beta,我似乎完全无法访问Swift类的属性.甚至更奇怪,我可以访问类本身来实例化它或其他什么,但完全无法访问它上面的属性.
所以,如果我有这个Swift类:
import UIKit
class TestViewController: UIViewController {
var foobar = true
}
Run Code Online (Sandbox Code Playgroud)
我试着这样做:
TestViewController *testViewController = [[TestViewController alloc] init]; // success
testViewController.foobar; // error
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?Xcode 9的新项目.
我有一个雨燕库,它是严重依赖obj.valueForKey()从NSObject.
迁移到Swift 4后,我发现这些调用总是崩溃,错误"这个类不是密钥值的密钥值...",除非我正在寻找的属性被声明@objc.
现在是否必须声明@objc使用此方法找到它们的属性?还有其他选择吗?
Swift的新手.我下面有两个片段:
NotificationCenter.default.addObserver(self,
selector:#selector(ViewController.notificationReceived),
name: Notification.Name(rawValue: name), object: nil)
@objc func notificationReceived(notification:Notification){
let x = notification.userInfo!
print("\(x["name"]!)")
}
Run Code Online (Sandbox Code Playgroud)
最后
let x:UITapGestureRecognizer = UITapGestureRecognizer(target: self,
action: #selector(tapped))
self.addGestureRecognizer(x)
func tapped(){
print("tapped")
self.delegate!.theViewTapped()
}
Run Code Online (Sandbox Code Playgroud)
为什么这个notificationCenter?我应该提供参数的@objc标签,selector但不提供UITapGestureRecognizer动作参数?
Selector和Action inSwift有什么区别?
unrecognized selector每次Notification到达时我都会崩溃并收到错误,而App会尝试执行其关联的方法.这是我的代码 - 在viewDidLoad:
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: Selector(("sayHello")), name:NSNotification.Name(rawValue: "dataDownloadCompleted"), object: nil)
Run Code Online (Sandbox Code Playgroud)
该sayHello()方法是相当简单的-看起来是这样的:
func sayHello() {
print("Hello")
}
Run Code Online (Sandbox Code Playgroud)
我已经确认已Notification成功发布并且成功到达 - 所以这不是问题.当App试图Notification通过执行该sayHello()方法时到达时,就会发生崩溃.它一直给我这个unrecognized selector错误.
我有什么想法我做错了吗?(顺便说一句,这与Swift 3和Xcode 8完美配合,但现在使用Swift 4和Xcode 9语法已经改变了[Xcode让我完成了必要的代码修复/更新] - 但崩溃仍在继续.)
我想在我的视图中添加一个手势,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
< blah blah blah >
// Add tap gesture
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
myView.addGestureRecognizer(tap)
}
Run Code Online (Sandbox Code Playgroud)
但是,在Swift 4中,我的编译器给出了以下错误:
Argument of '#selector' refers to instance method 'handleTap()' that is not exposed to Objective-C
Run Code Online (Sandbox Code Playgroud)
建议添加@objc以将此实例方法公开给Objective-C.
实现此目的的另一个选项(仅通过代码)将覆盖该touchesBegan()函数并使用它来处理该抽头.
我试图以"Swift"的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?或者这是添加此点按手势的正常和预期方式?
func getAllPropertyName(_ aClass : AnyClass) -> [String] {
var count = UInt32()
let properties = class_copyPropertyList(aClass, &count)
var propertyNames = [String]()
let intCount = Int(count)
for i in 0 ..< intCount {
let property : objc_property_t = properties![i]!
guard let propertyName = NSString(utf8String: property_getName(property)) as? String else {
debugPrint("Couldn't unwrap property name for \(property)")
break
}
propertyNames.append(propertyName)
}
free(properties)
return propertyNames
Run Code Online (Sandbox Code Playgroud)
这段代码一直工作到 Swift 3.2。但是我使用的是 Swift 4,它给了我一个空的 Array[String]。
我想对 Swift 中的方法调度有一个深入的了解。我从这个流行的博客中读到了以下三种类型的调度:
在那篇博客中,作者说 NSObject 子类型维护一个调度表(见证表)和一个消息调度层次结构。作者分享的代码片段如下:
class Person: NSObject {
func sayHi() {
print("Hello")
}
}
func greetings(person: Person) {
person.sayHi()
}
greetings(person: Person()) // prints 'Hello'
class MisunderstoodPerson: Person {}
extension MisunderstoodPerson {
override func sayHi() {
print("No one gets me.")
}
}
greetings(person: MisunderstoodPerson()) // prints 'Hello'
Run Code Online (Sandbox Code Playgroud)
我将引用作者对 Person 实例调用 sayHi()的推理:
greetings(person:) 方法使用表调度来调用 sayHi()。这按预期解决,并打印“Hello”。这里没有什么太令人兴奋的了。现在,让我们继承 Person
作者继续解释了在 MisunderstoodPerson 类型转换为 Person 的实例上调用sayHi():
请注意, sayHi() 是在扩展中声明的,这意味着该方法将通过消息调度来调用。当调用 greetings(person:) …
在Xcode 9 Beta中试用Swift 4.
出于某种原因,我在NSObject上使用键值访问器时遇到了崩溃.
有任何想法吗?
import Cocoa
class Person: NSObject {
var name = ""
var age = 0
}
let alpha = Person()
alpha.name = "Robert"
alpha.age = 53
alpha.value(forKey: "name")
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
Run Code Online (Sandbox Code Playgroud) swift ×10
swift4 ×6
ios ×4
xcode ×3
objective-c ×2
addobserver ×1
button ×1
dispatch ×1
selector ×1
uibutton ×1
xcode9 ×1
xcode9-beta ×1