我们知道我们可以使用if let
语句作为速记来检查可选的nil然后解包.
但是,我想使用逻辑AND运算符将其与另一个表达式相结合&&
.
因此,例如,在这里,我执行可选链接以解包并可选地将我的rootViewController向下转换为tabBarController.但是我没有嵌套if语句,而是将它们组合起来.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Run Code Online (Sandbox Code Playgroud)
综合给予:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Run Code Online (Sandbox Code Playgroud)
上面给出了编译错误使用未解析的标识符'tabBarController'
简化:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误条件绑定中的Bound值必须是Optional类型.尝试了各种语法变体后,每个都会产生不同的编译错误.我还没有找到订单和括号的获胜组合.
所以,问题是,是否可能,如果是这样,什么是正确的语法?
请注意,我想与做这个if
说法不是一个switch
语句或三元?
运营商.
我试图将模态视图控制器显示为UIPresentationFormSheet.视图出现,但我似乎无法调整大小.我的XIB具有适当的高度和宽度,但是当我这样调用它时它似乎被覆盖了:
composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:composeTweetController animated:TRUE];
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?我正在使用iPhone SDK 3.2 beta 4
刚刚下载了Xcode 7 Beta,enumerate
关键字出现了这个错误.
for (index, string) in enumerate(mySwiftStringArray)
{
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我克服这个吗?
而且,似乎count()
不再适用于计算长度String
.
let stringLength = count(myString)
Run Code Online (Sandbox Code Playgroud)
在上面一行,编译器说:
'count'不可用:访问集合上的'count'属性.
Apple已经发布了Swift 2.0的任何编程指南吗?
我setValue(value, forKey: key)
在我的NSKeyValueCoding兼容的Swift NSObject子类中成功使用了该方法.
这在String选项上非常有效,例如
var name:String?
Run Code Online (Sandbox Code Playgroud)
但是,在Int选项上,它会失败,触发我为了调试目的而重写的未定义键方法:
override func setValue(value: AnyObject!, forUndefinedKey key: String!) {
println("\(self) this class is not key value coding-compliant for the key \(key)")
}
Run Code Online (Sandbox Code Playgroud)
因此,例如,myId
具有良好整数值的键将触发上面的未定义键方法.
var myId:Int?
Run Code Online (Sandbox Code Playgroud)
如果我将上面的定义更改为非可选,那么一切正常:
var myId:Int = 0
Run Code Online (Sandbox Code Playgroud)
随着myId
作为一个可选的,我已经试过绝对一切,我可以在铸造,展开,初始化等方式想到的.它只是没有将类视为符合这些数值的键值.
我知道这是一个很好的数值.将var声明更改为String?崩溃.它在lldb看起来也很好:
Printing description of key:
myId
key NSObject 0x00007fb8d530ca20 0x00007fb8d530ca20
k NSString "myId" 0x00007fa2aa942f20
value __NSCFNumber * Int64(4348129) 0xb000000004258e13
Printing description of value:
4348129
(lldb)
Run Code Online (Sandbox Code Playgroud)
所以,问题是,有没有人在Swift中使用过 - setValue(value, forKey: key)
Int类型的NSKeyValueCoding方法成功了吗?
如何在Swift中设置属性的值,而不didSet()
在初始化上下文之外调用它的函数?下面的代码是在类noside()
函数中实现此目的的失败实验
class Test
{
var toggle : Bool = 0
var hoodwink : Int = 0 {
didSet(hoodwink)
{
toggle = !toggle
}
}
// failed attempt to set without a side effect
func noside(newValue : Int)
{
hoodwink = newValue
println("hoodwink: \(hoodwink) state: \(toggle)")
}
func withside(newValue : Int)
{
self.hoodwink = newValue
println("hoodwink: \(hoodwink) state: \(toggle)")
}
}
Run Code Online (Sandbox Code Playgroud)
使用自动合成属性在Objective-C中进行操作非常简单:
有副作用(如果存在于setter中):
self.hoodwink = newValue;
Run Code Online (Sandbox Code Playgroud)
没有副作用:
_hoodwink = newValue;
Run Code Online (Sandbox Code Playgroud) 在我们系统的其他地方寻找内存泄漏,我创建了一个带有元刷新标签的20 MB网页.我们的想法是通过我们的数据路径代码移动大量数据以确认内存稳定性.
<html>
<meta http-equiv="refresh" content="1">
<body>
<div style="border: 1px solid red">
Content loading
</div><!-- 20mb worth of comments -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我发现的是uiwebview显示元刷新页面非常非常快地泄漏内存.即使我们的代码没有播放,应用程序内存也会在大约2分钟内达到300mb并且会在低内存警告上被拍摄.
我已停止刷新加载并尝试取消分享webview.
我试过loadurl:"about:blank",loadhtml:"",javascript文档关闭.
我还尝试编写一个递归的removeFromSuperview和removeFromParentViewController,读取webview中的私有scrollview是一个内存问题,但该内存永远不会被释放.当我们完成它时,我似乎无法找到一种可靠的方法来关闭,取消一个webview.
我们在网页浏览速度缓慢的情况下生活了很长一段时间,并且确实希望找到一种方法来确保在完成后可以完全清理webview.我们最近将应用程序转换为ARC,但没有改变内存速率.
我正在考虑通过webview中的所有对象尝试递归循环,看看它们是否可以被释放.仪器显示20 mb的cfdatas,alive,每次刷新20MB页面,但不会将它们显示为泄漏.如果我只提供响应头并完成urlprotocol客户端我们运行稳定,所以ale确认其余数据路径中的memleaks,但这是一个如此戏剧性的测试用例结果我希望找到一个webview内存泄漏解决方案一次并为所有人.
有没有人有更好的想法,或者有没有人尝试通过uiwebview中的对象进行递归?
我正在尝试迁移大约11Mb的iPhone/iPad sqlite商店.它有大约30个不同的实体,都非常相互关联.
在3GS上,需要相当长的时间.即使轻量级迁移也需要大约四分钟.
我想这是因为所有关系都保存在内存中.
阅读Apple迁移指南,它说对于大型数据集,一种方法是使用不同的映射模型进行多次传递.
一切都很好.但是,如果一个映射模型中的实体与另一个映射模型中的实体相关,则似乎无法执行此操作.实际上,编译错误是在Mapping Model xcmappingmodel文件中的"无法使用nil映射名称自动生成值表达式"的行中生成的.
任何提示非常感谢.
非常感谢,
马克斯
覆盖属性的didSet观察者会导致递归,为什么?
class TwiceInt {
var value:Int = 0 {
didSet {
value *= 2
}
}
}
class QuadInt : TwiceInt {
override var value:Int {
didSet {
value *= 4
}
}
}
let t = TwiceInt()
t.value = 5 // this works fine
let q = QuadInt()
q.value = 5 // this ends up in recursion
Run Code Online (Sandbox Code Playgroud)
如果我更新QuadInt
与
class QuadInt : TwiceInt {
override var value:Int {
didSet {
super.value *= 4
}
}
}
q.value = …
Run Code Online (Sandbox Code Playgroud) 在Xcode 5之前,可以NSAssert
使用默认的构建设置阻止发布版本包含语句及其变体:
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
Run Code Online (Sandbox Code Playgroud)
此设置可project.pbxproj
在此处找到并在Xcode中设置:
(请注意,此抓取是从转换为Xcode 5的Xcode 4项目中获取的.)
每个目标只在Release版本中继承此设置.显然这是一件好事.该应用程序可能无论如何都会挣扎,而不是立即崩溃.而对于Debug版本,您希望在NSAssert
失败时立即知道.
但是,我很难找到Xcode 5中的等价物.
使用默认模板创建新项目不会显示等效设置:
我的问题是,Xcode 5中的等效设置是什么,还是NS_BLOCK_ASSERTIONS
必须手动添加到Other C Flags
Release版本中?
在Basic Operators一节中,Swift编程语言指南指出++是一个有效的运算符:
"更复杂的例子包括逻辑AND运算符&&(如在输入DoorCode &&传递瑞典扫描中)和增量运算符++ i, 这是一个将i的值增加1的快捷方式."
摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/gb/jEUH0.l
但是,在游乐场尝试这个时;
import UIKit
let i = 0
i++
Run Code Online (Sandbox Code Playgroud)
构建错误显示:
swift一元运算符'++'不能应用于'Int'类型的操作数
为什么?
swift ×6
didset ×2
ios ×2
iphone ×2
build ×1
cocoa-touch ×1
core-data ×1
expression ×1
memory ×1
memory-leaks ×1
nsnumber ×1
objective-c ×1
properties ×1
recursion ×1
refresh ×1
swift2 ×1
uikit ×1
uiwebview ×1
xcode ×1
xcode5 ×1