我想将一个UIButton连接到一段代码 - 从我发现的,在Swift中执行此操作的首选方法仍然是使用该addTarget(target: AnyObject?, action: Selector, forControlEvents: UIControlEvents)
函数.这使用该Selector
结构可能是为了向后兼容Obj-C库.我想我理解@selector
Obj-C 的原因- 能够引用一个方法,因为在Obj-C方法中不是一流的值.
但在Swift中,函数是一流的值.有没有办法将UIButton连接到闭包,类似于:
// -- Some code here that sets up an object X
let buttonForObjectX = UIButton()
// -- configure properties here of the button in regards to object
// -- for example title
buttonForObjectX.addAction(action: {() in
// this button is bound to object X, so do stuff relevant to X
}, forControlEvents: UIControlEvents.TouchUpOutside)
Run Code Online (Sandbox Code Playgroud)
据我所知,上述目前是不可能的.考虑到Swift看起来像是一个非常实用的功能,为什么会这样?这两个选项可以明显共存,以实现向后兼容.为什么这不像JS中的onClick()更像?似乎将UIButton连接到目标 - 动作对的唯一方法是使用仅出于向后兼容性原因而存在的东西(Selector
).
我的用例是在循环中为不同的对象创建UIButtons,然后将每个对象挂钩到一个闭包.(在字典/子类化UIButton中设置标记/查找是脏的半解决方案,但我对如何在功能上执行此操作感兴趣,即此闭包方法)
我想使用自定义对象作为Dictionary键,主要是,我有这样的事情:(我不能使用.net 4.0所以我没有元组)
class Tuple<A, B> : IEquatable<Tuple<A,B>>
{
public A AValue { get; set; }
public B BValue { get; set; }
public Tuple(A a, B b){ AValue = a; BValue = b; }
public bool Equals(Tuple<A, B> tuple)
{
return tuple.AValue.Equals(AValue) && tuple.BValue.Equals(BValue);
}
public bool Equals(object o)
{
return this.Equals(o as Tuple<A,B>);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我做这样的事情.
var boolmap = new Dictionary<Tuple<bool, bool>, string>();
boolmap.Add(new Tuple<bool,bool>(true, true), "A");
boolmap.Add(new Tuple<bool,bool>(true, false), "B");
boolmap.Add(new Tuple<bool,bool>(false, true), "C");
boolmap.Add(new Tuple<bool,bool>(false, false), "D"); …
Run Code Online (Sandbox Code Playgroud) 我试着找到一些相关的问题,却无法得到任何东西,希望有人可以提供帮助.
我在故事板上设置了一些UIViewController.然后我想在代码中加载一个视图控制器并将其推送到导航堆栈.我想出正确的方法是使用
instantiateViewControllerWithIdentifier
这个调用init(coder: NSCoder)
,一切都很好,我的程序工作,但我希望能够有一个自定义初始化程序,为我的视图控制器设置一些变量.考虑以下:
class A : UIViewController {
let i : Int
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// property self.i not initialized at super.init call
}
}
Run Code Online (Sandbox Code Playgroud)
我显然得到一个错误,因为i
需要在创建对象时指定.对此有何解决方案?我对以后声明和配置它并不感兴趣,i
因为var
它失败了,我不再拥有i
不可变的编译器保证.
假设我有一个当前加载的ViewController
变量i
.该值是可变的并且可以改变.现在假设从这个ViewController我想呈现另一个,并用它初始化它i
.
class ViewController: UIViewController {
var i : Int
// ... other things
// in response to some button tap...
@IBAction func tappedButton(sender: AnyObject) {
let st = UIStoryboard(name: "Main", bundle: …
Run Code Online (Sandbox Code Playgroud) 我有一个关于删除git子模块的问题.我正在使用git组织我的配置文件和vim包,将vim包作为子模块.现在我正在尝试删除一个子模块(根据这里的说明,但我没有成功.
--git submodule deinit -f vim/bundle/snipmate-snippets
Submodule work tree 'vim/bundle/snipmate-snippets' contains a .git directory
(use 'rm -rf' if you really want to remove it including all of its history)
Run Code Online (Sandbox Code Playgroud)
所以我试试rm -rf
......
--git rm -rf vim/bundle/snipmate-snippets
error: the following submodule (or one of its nested submodules)
uses a .git directory:
vim/bundle/snipmate-snippets
(use 'rm -rf' if you really want to remove it including all of its history)
Run Code Online (Sandbox Code Playgroud)
我做错了什么?显然只是rm -rf
像git一样告诉我不够好,因为.gitmodules文件中的子模块条目将保留.谢谢.
我刚刚完成了以下Codility Peaks问题.问题如下:
给出了由N个整数组成的非空零索引数组A. 峰值是一个比其邻居更大的数组元素.更确切地说,它是指数P,使得0 <P <N-1,A [P-1] <A [P]和A [P]> A [P + 1].例如,以下数组A:
A[0] = 1
A[1] = 2
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
Run Code Online (Sandbox Code Playgroud)
有三个峰:3,5,10.我们想把这个数组分成包含相同数量元素的块.更确切地说,我们想要选择一个能产生以下块的数字K:A [0],A [1],...,A [K-1],A [K],A [K + 1], ...,A [2K - 1],... A [N - K],A [N - K + 1],...,A [N - 1].更重要的是,每个块应包含至少一个峰值.请注意,块的极端元素(例如A [K-1]或A [K])也可以是峰值,但前提是它们同时具有两个邻居(包括相邻块中的一个).目标是找到阵列A可以划分的最大块数.数组A可以分为以下块:
一个街区(1,2,3,4,3,4,1,2,3,4,6,2).该块包含三个峰.
两个块(1,2,3,4,3,4)和(1,2,3,4,6,2).每个街区都有一个高峰.
三个块(1,2,3,4),(3,4,1,2),(3,4,6,2).每个街区都有一个高峰. …
我对map
Python中的函数有疑问.
根据我的理解,该函数不会改变它正在运行的列表,而是创建一个新的并返回它.它是否正确 ?
另外,我有以下代码
def reflect(p,dir):
if(dir == 'X'):
func = lambda (a,b) : (a * -1, b)
else:
func = lambda (a,b) : (a, b * -1)
p = map(func,p)
print 'got', p
Run Code Online (Sandbox Code Playgroud)
points
是一个元组数组,如: [(1, 1), (-1, 1), (-1, -1), (1, -1)]
如果我以这种方式调用上述函数:
print points
reflect(points,'X')
print points
Run Code Online (Sandbox Code Playgroud)
列表points
不会改变.但是在功能内部,打印功能可以正确打印出我想要的内容.
有人可能指点我在某个方向,我可以学习如何通过值/参考等传递如何在python中工作,以及我如何解决上述问题?或许我在努力模仿Python中的Haskell ......
谢谢
编辑:
说而不是p = map(func,p)
我
for i in range(len(p)):
p[i] = func(p[i])
Run Code Online (Sandbox Code Playgroud)
列表的值在函数外部更新,就像通过引用一样工作.呃,希望这很清楚:S
考虑以下玩具示例Swift代码:
protocol Testable{}
class MyObj : Testable{}
class Test {
var arr:[Testable] = []
var didRun:Bool = false
func run() -> [Testable]{
if(didRun){
println("arr has \(arr.count) elements")
for e in arr{ // following access causes EXC_BAD_ACCESS
println(e)
}
return arr
} else{
provider({ (myArr : [AnyObject]) -> () in
self.arr = myArr as [MyObj]
self.didRun = true
})
return []
}
}
func provider( cb : ([AnyObject] -> ()) ){
let a:[MyObj] = [MyObj(),MyObj(),MyObj()]
cb(a)
}
}
Run Code Online (Sandbox Code Playgroud)
并按以下方式调用它:
let t …
Run Code Online (Sandbox Code Playgroud) 我的问题是我是否可以将静态类分配给另一个变量(以及它将是什么类型)?
说我有
public static class AClassWithALongNameIDontWantTotType{
public static bool methodA() { stuff }
}
Run Code Online (Sandbox Code Playgroud)
然后我有
class B{
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做,以便class B
我可以将这个类重新分配给名称较短的内容,例如:
SomeType a = AClassWithALongNameIDontWantTotType
Run Code Online (Sandbox Code Playgroud)
然后能够做到
a.methodA()
Run Code Online (Sandbox Code Playgroud)
?
我可以通过做类似的事情来获得一个功能
Func<bool> a = AClassWithALongNameIDontWantTotType.methodA()
Run Code Online (Sandbox Code Playgroud)
但我更愿意拥有全班.
谢谢!
我正在尝试了解monad变换器,我正在阅读haskell wiki上的这个页面.
我困惑的代码如下:
isValid :: String -> Bool
isValid s = length s >= 5
getValidPassword :: MaybeT IO String
getValidPassword = do s <- lift getLine
guard (isValid s)
return s
askPassword :: MaybeT IO ()
askPassword = do lift $ putStrLn "Insert your new password:"
value <- getValidPassword
lift $ putStrLn "Storing in database..."
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我可以运行它,它的工作原理.但现在,askPassword
改为:
askPassword :: MaybeT IO ()
askPassword = do lift $ putStrLn "Insert your new password:"
value <- msum $ …
Run Code Online (Sandbox Code Playgroud) 我有一个关联列表
L :: [(a,b)]
Run Code Online (Sandbox Code Playgroud)
每个a
都与a相关联b
.
这b
只是额外的信息,而有趣的部分是a
.
我想合作a
,所以我有一个f
类型的功能[a] -> [a]
.(在我的问题中,我实际上有[a] -> [[a]]
,所以如果你的答案会推广到我可以遍历的任何容器,这将是好的.
我想我需要类似的东西
[(a,b)] -> ([a] -> T a) -> T (a,b)
Run Code Online (Sandbox Code Playgroud)
哪个T
是我可以穿越的容器.这个函数基本上重新排列了a
它的周围,它没有创建新的,或删除任何东西.
我似乎已经得到停留在什么是运行最惯用的方式f
对a
部分[(a,b)]
,并在最后附上回b
.
我想在最后使用Data.Map
简单的查找,但我想知道是否有更好的方法来做我正在做的事情,不知何故"沿线" b
与其余的计算一起.
如果没有,你能解释一下原因吗?
显而易见的另一种方法是重写,f
但我不希望因为f
不关心b
.
非常感谢您的帮助.